Romlige forskjeller i næringsstruktur, virkninger av eksogene sjokk i basissysselsettingen, og lokale forskjeller I sysselsettingsvekst.

I denne oppgaven vil vi se på næringsstrukturer på Haugalandet, Sunnhordland og Ullensvang.

Problemstillinger og beregninger vi vil se nærmere på

Oversikt over befolkningene i regionene

Haugalandet

Haugalandet består av kommunene Bokn (852), Haugesund (37357), Karmøy (42186), Sauda (4595), Tysvær(11065), Utsira(198) og Vindafjord(8714). tilsammen bor det 104967 personer i denne regionen. i tidsperioden vi har hentet inn data har det vert kommunesammenslåing i denne regionen. Da ble Ølen og vindafjord slått i sammen til en kommune (hvordan har vi tatt hensyn til dette???)

Sunnhordland og Ullensvang

Sunnhordland og Ullensvang består av kommunene Bømlo(11957), Etne(4062), Fitjar(3189), Kvinnherad(13071), Stord(18759), Sveio(5766), Tysnes(2869) og Ullensvang(11048). Tilsammen bor det 70721 personer i denne regionen.

Tallene er hentet fra SSB 09.01.21 (https://www.ssb.no/statbank/table/01223/tableViewLayout1/) gjelder for 4 kvartal 2020.

“Forklar litt om de forskjellige næringene”…..

1 Sysselsetting i ulike næringer, etter arbeidssted

Haugalandet

Første regionen vi velger å se på er Haugalandet. Her ønsker vi å se på utviklingen fra 2008 til 2020, av antall ansatte i sin helhet i regionen, samt de 6 mest relevante næringene.

I 2020 er det i underkant av 50 000 ansatte i alle næringer på Haugalandet. Av Fig. 1 ser vi at Haugalandet fikk en nedgang i antall ansatte i 2015 og 2016. I 2017 og 2018 ble det vekst, frem til det snudde i 2019 igjen.

I Fig. 2 ser vi at flere av kommunene på Haugalandet har hatt liten arbeidsplassvekst, med unntak av Tysvær, Vindafjord og Karmøy i den siste tiårsperioden. Vi ser dette mer tydelig på fig. 3 og 4.

Figur 3 og 4 viser utviklingen av det totale antall ansatte i alle næringer på kommunalt nivå, innenfor Haugaland-regionen.

I disse figurene, så ser vi tydelig at Haugesund har hatt reduksjon i antall ansatte totalt sett, mens Karmøy, Vindafjord og Tysvær har hatt en markant vekst de siste ti årene. Siden Haugesund har flest arbeidsplasser betyr utviklingen i Haugesund mye for de samlede tallene.

Warning: Removed 1 row(s) containing missing values (geom_path).

Warning: Removed 1 row(s) containing missing values (geom_path).

Figur 5 og 6 viser utviklingen av de 6 mest relevante næringene i Haugalandsregionen på kommune nivå.

Vi ser i de tre største kommunene, Haugesund, Karmøy og Vindafjord utgjør næringene Helse- og Sosialtjenester og Industri de største. Helse- og Sosialtjenester har vokst jevnt og trutt de siste tiårene, mens antall ansatte i industrinæringen har variert fra kommune til kommune. I Haugalandet utgjør primærnæringer (jordbruk, Skogbrug og Fiske) en større andel, enn hos Karmøy og Haugesund hvor primærnæringene kun utgjøre en liten andel.

Sysselsettingsutviklingen for ulike næringer i ulike kommuner og for regionen samlet.

Det er relativt store kommunevise forskjeller i næringsstrukturen. Rogaland har en forholdsvis ensidig næringsstruktur, olje og gass er dominerende. Fylket er suverent dominerende for fossil energi. De har for øvrig de siste årene satset på et en mer differensiert næringsstruktur og næringsliv ved å satse på helse, IKT og fornybar energi.

I våre modeller, er satsingen på helse den mest tydelige. Av rent tekniske grunner er det vanskelig å se utviklingen i enkelte næringer som utgjør små andeler, på grunn av skalaen som er benyttet. Til tross for dette, kan man se at næringsstrukturen i regionen samlet generelt sett har endret seg lite.

Rogaland har gode jordbruksmuligheter, men i Fig. 2: Haugalandet ser vi en nedgang i sysselsettingen de siste tiårene, mens det er en marginal økning i Sunnhordaland, jf. Fig 9. I Fig. 12: ser vi at Tysnes har hatt en markant økning i primærnæringen, relativt sett.

Universitets- og høgskolesektoren er liten i Rogaland, og den består for det første av Universitetet i Stavanger (UiS) og Høgskulen på Vestlandet (HVL) med campus Haugesund.

Haugaland Vekst, som er eigd/drevet av Haugalandsregionen er i spissen på å legge til rette for å etablere ny industri samt andre arbeidsplasser i regionen.

I helsesektoren er Stavanger universitetssykehus (SuS) sentralt.

Sunnhordland

Videre ønsker vi å se på den samme utviklingen, men denne gangen i Sunnhordlandsregionen.

Her viser figur 7 utviklingen til den totale summen av ansatte i Sunnhordlandsregionen fra 2008 til 2020. Sunnhordaland har i 2020 i underkant av 25 500 ansatte. Vi ser ut ifrå figuren at Sunnhordlandsregionen hadde ein markant vekst ifrå 2008 til 2014 med periodar med svak nedgang. Fra 2014 har det vært en reduksjon i totalt antall ansatte.

Figur 8 viser utviklingen av totalt ansatte i Sunnhordlandsregionen på kommunenivå i hele regionen fra 2008 til 2020. Denne figuren gir oss en oversikt, men er ikke heilt brukervennelig. Vi lager dermed en mer oversiktlig figur, jf. figur 9 & 10.

Vi ser her ut ifra figur 9 og 10 utviklingen for hver enkelt kommune i Sunnhordland totalt sett, og her ser vi mye tydligere utviklingen fra 2008 til 2020. En kan se her at Kvinnherad, Etne og Fitjar har hatt en reduksjon i totalt ansatte, mens Tysnes og Sveio har hatt ein kraftig vekst. En interessant bemerking er Stord i 2014 og Kvinnherad fra 2008 til 2017.

For å få et bedre oversikt over utviklingen i kommunen ønsker vi å se på de 6 mest relevante næringene i hver kommune.

Warning: Removed 1 row(s) containing missing values (geom_path).

Figur 11 og 12 viser de 6 mest relevante næringene i hver enkelt kommune i Sunnhordlandsregionen fra 2008 til 2020.

En ser ut ifra figur 11 at i de tre største kommunene, Bømlo, Kvinnherad og Stord så har de alle hatt en reduksjon i industrien, samtidig som de har hatt en vekst i helse- og sosialtjenester. Tysnes har vært stabil når det kommer til industri, men har sett ein markant vekst i primærnæringen (Jordbruk, Skogbruk og Fiske).

Sysselsettingsutviklingen for ulike næringer i ulike kommuner og for regionen samlet.

Det første bemerkelsesverdige i Sunnhordlandsregionen er den markante reduksjonen i industri i Stord kommune i 2014, samt Kvinnherad fra 2008. Dette stemmer overens med to hendelser. Den første er oljeknekken i 2014 som medførte at bl.a. Aker Stord AS som er avhengig av Olje-industrien måtte permitere.

Stord er en kommune som har mye offshore industri. I 2008/2009 så stengte Sør-Norge Aluminium “B-Hallen” som medførte 50% reduksjon i produksjon, og dermed ansatte. Interessant å bemerke at i Kvinnherad så er antall industriarbeidere redusert samtidig som antall ansatte i Helse- og Sosialetjenester økt. Bømlo har også sett en stabil reduksjon i ansatte innen industri, samt vekst i Helse- og Sosialetjenester frem til 2018.

Ser en på hele Sunnhordlandsregionen i sin helhet, så ser vi en svært tydelig vekst innen Helse- og Sosialetjenester, og reduksjon innen industri i hele regionen. Kvinnherad, Tysnes og Fitjar har opplevd ein markant vekst innen primærnæring. Kan det vere ein grunn til dette som burde diskuterast??

Fortsett Her (OA, KH)

Hardanger

Til slutt må vi gjere det samme med Hardanger

I henhold til oppgavens krav til betrakter vi Hardanger før 2019 som Ullensvang- og Odda kommune som to separerte kommuner. i 2020 så ble Ullensvang, Odda og Jondal slått sammen til Ullensvang. Dette forklarer den voldsomme økningen i sysselsetting i regionen ved tidspunktet for kommunesammenslåing.

Warning: Removed 1 row(s) containing missing values (geom_path).

Ullensvang kommune har stor kraftproduksjon og hovednæringen er industri. Majoriteten av kraftproduksjonen foregår i tidligere Odda. Odda er et ensidig industristed, men har også en maritim næring i tillegg. I figur 16 ser vi at industrinæringen utgjør en betraktelig større andel av sysselsettingen i her. Industrinæringen er også omfattet og bygg- og anleggsvirksomhet. På motsatt side er jordbruk, helse- og sosialtjenester dominerende i Ullensvang.

Generelt om Ullensvang kommune

Ullensvang kommune (med Odda) har hatt en jevn og negativ befolkningsvekst i mange tiår. Det gjenspeiles ikke tydelig i våre modeller på grunn av skalaen som er brukt. I tillegg har vi ikke hensyntatt innvandrende arbeidere, eller midlertidige fraflyttede som for eksempel studenter.

2 (Dette er >EGENTLIG< siste del av oppgåve 3. Denne og Gini/RDI for oppgåve 3 bør bli byttast om)

Finner lokaliseringskvotienter for ulike næringer i ulike kommuner, og for regionen samlet

[1] 0.1050339
[1] 0.1050339

For region Haugaland:

Lokalkvotient, region: Haugalandet
År Alle Jordbruk Industri Vann Bygg Finans Underv. Helse
2008 50367 1.075456 1.527397 1.169062 1.017606 0.501835 0.933108 0.996224
2009 49548 1.084237 1.480269 1.158345 1.048055 0.483106 0.971070 1.000013
2010 49793 1.108506 1.434976 1.172909 1.060696 0.469899 0.968415 0.981693
2011 51035 1.129625 1.422513 1.174768 1.120299 0.436547 0.949340 0.983962
2012 51459 1.083943 1.446199 1.175755 1.058730 0.422893 0.964431 0.975939
2013 51940 1.061881 1.447049 1.174457 1.078970 0.398713 0.952646 0.979683
2014 52578 1.040438 1.443355 1.143914 1.069367 0.396168 0.959903 0.991453
2015 50552 1.103504 1.500907 1.112182 1.077831 0.379590 0.957596 1.006411
2016 50296 1.128518 1.529210 1.110672 1.056575 0.377096 0.983459 1.003760
2017 50976 1.115553 1.542237 1.112809 1.059688 0.372480 0.969197 1.011095
2018 51214 1.105522 1.545841 1.066554 1.038641 0.349450 0.977665 1.021492
2019 51670 1.093159 1.578607 1.074577 1.010368 0.327388 0.956960 1.025697
2020 51039 1.099049 1.601510 1.077858 0.991460 0.334849 0.952426 1.026936

GINI Regionaltnivå

Haugalandet

Haugalandet
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2008 50367 0.000002 0.000111 0 435.6012 18.70584 1399.9540
2009 49548 0.000003 0.000091 0 394.1549 21.69867 404507.3533
2010 49793 0.000005 0.000074 0 322.9766 25.47550 275.1527
2011 51035 0.000007 0.000071 0 291.8300 26.44261 313.0738
2012 51459 0.000003 0.000079 0 471.2626 25.31286 210.6607
2013 51940 0.000002 0.000079 0 663.1602 25.36956 249.2110
2014 52578 0.000001 0.000077 0 1031.8851 25.78627 590.1378
2015 50552 0.000004 0.000095 0 396.0033 24.04333 761.0617
2016 50296 0.000006 0.000104 0 317.7330 23.72055 1284.0690
2017 50976 0.000005 0.000109 0 356.6107 23.56357 436.3016
2018 51214 0.000004 0.000109 0 401.9133 23.54160 225.7136
2019 51670 0.000003 0.000122 0 461.0766 22.22460 189.0190
2020 51039 0.000004 0.000131 0 424.8519 21.55281 176.8174

GINI Kommunalt nivå

Haugesund

Haugesund: Gini & RDI
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2008 17611 0.000028 0.000004 0.000000 43.39824 34.95132 55.70295
2009 17294 0.000029 0.000003 0.000000 42.50572 40.54894 60.75005
2010 17460 0.000027 0.000002 0.000000 46.40941 56.43869 82.04106
2011 17901 0.000027 0.000002 0.000000 51.26044 53.63729 67.07554
2012 18178 0.000026 0.000003 0.000000 54.34177 46.66353 141.25665
2013 18337 0.000027 0.000003 0.000000 55.25898 45.70694 113.64877
2014 18609 0.000026 0.000002 0.000000 57.08808 52.38028 115.16419
2015 17855 0.000024 0.000002 0.000000 56.93230 54.69388 57.73009
2016 17806 0.000026 0.000002 0.000000 54.61078 54.69499 57.46911
2017 18117 0.000024 0.000003 0.000000 57.21419 52.20065 55.82136
2018 18295 0.000026 0.000003 0.000000 56.40031 51.93576 54.49432
2019 18448 0.000026 0.000005 0.000000 57.74196 41.05048 47.42545
2020 18137 0.000024 0.000006 0.000001 58.31852 35.84411 40.22532
Haugesund: Lokalkvotient
Eir/Er
Ein/En
LQ
År Alle Primær Industri Helse Primær Industri Helse Primær Industri Helse
2008 17611 0.0074 0.1300 0.2071 0.0304 0.1014 0.1892 0.2426 1.2823 1.0949
2009 17294 0.0066 0.1206 0.2127 0.0301 0.0960 0.1963 0.2189 1.2570 1.0839
2010 17460 0.0070 0.1080 0.2107 0.0285 0.0902 0.1985 0.2449 1.1963 1.0614
2011 17901 0.0069 0.1082 0.2141 0.0264 0.0895 0.1992 0.2620 1.2083 1.0749
2012 18178 0.0069 0.1100 0.2044 0.0253 0.0885 0.1973 0.2720 1.2420 1.0359
2013 18337 0.0063 0.1101 0.2063 0.0244 0.0882 0.1975 0.2574 1.2481 1.0446
2014 18609 0.0064 0.1066 0.2069 0.0240 0.0875 0.1983 0.2691 1.2183 1.0438
2015 17855 0.0068 0.1013 0.2223 0.0244 0.0830 0.2050 0.2801 1.2202 1.0845
2016 17806 0.0062 0.0979 0.2245 0.0245 0.0797 0.2071 0.2523 1.2295 1.0840
2017 18117 0.0068 0.0974 0.2245 0.0243 0.0783 0.2066 0.2798 1.2448 1.0867
2018 18295 0.0058 0.0971 0.2245 0.0236 0.0778 0.2061 0.2480 1.2474 1.0890
2019 18448 0.0060 0.1021 0.2270 0.0233 0.0778 0.2059 0.2561 1.3133 1.1024
2020 18137 0.0066 0.1050 0.2348 0.0238 0.0771 0.2100 0.2784 1.3617 1.1184

GINI Kommunalt nivå

Bokn

Bokn: Gini & RDI
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2008 412 0.000000 0 0 9.265663 66.04803 41.42099
2009 407 0.000000 0 0 8.350102 7395.58720 37.39901
2010 420 0.000001 0 0 8.232807 220.82720 24.16725
2011 428 0.000001 0 0 7.052729 619.24877 20.15114
2012 425 0.000001 0 0 8.132938 309.92125 48.03532
2013 439 0.000000 0 0 9.909167 82.94909 45.23552
2014 434 0.000000 0 0 9.731145 53.99395 47.98403
2015 424 0.000001 0 0 8.370275 62.40629 38.87511
2016 427 0.000001 0 0 7.420518 71.34951 27.64706
2017 424 0.000001 0 0 6.170807 72.90931 33.68794
2018 425 0.000001 0 0 6.748289 35.63639 31.23108
2019 443 0.000001 0 0 6.848420 35.29806 138.29443
2020 439 0.000001 0 0 7.760597 19.83052 138.30512
Bokn
Eir/Er
Ein/En
LQ
År Alle Primær Industri Helse Primær Industri Helse Primær Industri Helse
2008 412 0.1383 0.1165 0.1650 0.0304 0.1014 0.1892 4.5474 1.1494 0.8724
2009 407 0.1499 0.0958 0.1695 0.0301 0.0960 0.1963 4.9763 0.9986 0.8638
2010 420 0.1500 0.0857 0.1571 0.0285 0.0902 0.1985 5.2567 0.9498 0.7916
2011 428 0.1682 0.0911 0.1495 0.0264 0.0895 0.1992 6.3636 1.0180 0.7508
2012 425 0.1482 0.0918 0.1765 0.0253 0.0885 0.1973 5.8641 1.0364 0.8945
2013 439 0.1253 0.1002 0.1754 0.0244 0.0882 0.1975 5.1413 1.1367 0.8881
2014 434 0.1267 0.1060 0.1774 0.0240 0.0875 0.1983 5.2880 1.2117 0.8949
2015 424 0.1439 0.0991 0.1792 0.0244 0.0830 0.2050 5.8968 1.1930 0.8745
2016 427 0.1593 0.0937 0.1710 0.0245 0.0797 0.2071 6.5029 1.1759 0.8254
2017 424 0.1863 0.0920 0.1769 0.0243 0.0783 0.2066 7.6778 1.1752 0.8563
2018 425 0.1718 0.1059 0.1741 0.0236 0.0778 0.2061 7.2846 1.3606 0.8447
2019 443 0.1693 0.1061 0.1986 0.0233 0.0778 0.2059 7.2720 1.3643 0.9649
2020 439 0.1526 0.1276 0.2027 0.0238 0.0771 0.2100 6.4224 1.6538 0.9656

GINI Kommunalt nivå

Tysvær

Tysvær: Gini & RDI
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2008 5193 0.000006 0 0 27.18744 93.37426 142.39765
2009 5145 0.000007 0 0 26.65220 75.33551 139.73894
2010 5219 0.000007 0 0 27.74925 124.19307 148.76566
2011 5574 0.000006 0 0 33.44731 109.10156 55.68156
2012 5470 0.000006 0 0 35.58264 79.62536 97.38526
2013 5482 0.000005 0 0 39.04164 73.44589 108.07665
2014 5591 0.000004 0 0 44.02012 69.92755 211.22384
2015 5412 0.000005 0 0 36.57733 67.12334 191.30078
2016 5409 0.000006 0 0 35.22895 52.97124 89.59993
2017 5437 0.000005 0 0 39.66927 56.35909 146.44512
2018 5444 0.000004 0 0 42.98937 49.78888 533.20329
2019 5550 0.000004 0 0 43.77327 51.67297 235.02172
2020 5503 0.000005 0 0 38.69103 44.91354 113.62509
Tysvær
Eir/Er
Ein/En
LQ
År Alle Primær Industri Helse Primær Industri Helse Primær Industri Helse
2008 5193 0.0672 0.1121 0.1822 0.0304 0.1014 0.1892 2.2090 1.1057 0.9629
2009 5145 0.0676 0.1092 0.1891 0.0301 0.0960 0.1963 2.2458 1.1383 0.9635
2010 5219 0.0646 0.0983 0.1918 0.0285 0.0902 0.1985 2.2629 1.0892 0.9661
2011 5574 0.0563 0.0987 0.1812 0.0264 0.0895 0.1992 2.1310 1.1024 0.9098
2012 5470 0.0534 0.1011 0.1870 0.0253 0.0885 0.1973 2.1118 1.1418 0.9480
2013 5482 0.0500 0.1018 0.1883 0.0244 0.0882 0.1975 2.0511 1.1544 0.9532
2014 5591 0.0467 0.1018 0.1935 0.0240 0.0875 0.1983 1.9479 1.1635 0.9761
2015 5412 0.0517 0.0979 0.1997 0.0244 0.0830 0.2050 2.1206 1.1794 0.9745
2016 5409 0.0529 0.0985 0.1960 0.0245 0.0797 0.2071 2.1591 1.2370 0.9461
2017 5437 0.0495 0.0960 0.1997 0.0243 0.0783 0.2066 2.0388 1.2267 0.9669
2018 5444 0.0468 0.0979 0.2043 0.0236 0.0778 0.2061 1.9865 1.2581 0.9909
2019 5550 0.0461 0.0971 0.2016 0.0233 0.0778 0.2059 1.9813 1.2489 0.9793
2020 5503 0.0496 0.0994 0.2012 0.0238 0.0771 0.2100 2.0876 1.2886 0.9581

GINI Kommunalt nivå

Karmøy

Karmøy: Gini & RDI
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2008 20182 0.000002 0.000041 0 210.1846 12.24439 127.5319
2009 19767 0.000001 0.000031 0 243.0018 14.92759 210.9479
2010 19754 0.000001 0.000023 0 305.4325 17.96887 124.5623
2011 20028 0.000002 0.000020 0 226.4475 19.38142 202.8559
2012 20304 0.000002 0.000020 0 238.1573 19.57346 180.0833
2013 20572 0.000003 0.000019 0 201.0946 20.63139 185.2065
2014 20714 0.000003 0.000019 0 196.4961 20.71105 263.0355
2015 19862 0.000002 0.000022 0 199.4498 19.80640 988.7477
2016 19754 0.000001 0.000025 0 254.0459 18.89665 4244.5327
2017 20047 0.000002 0.000029 0 212.1639 17.99531 1844.0592
2018 20074 0.000001 0.000029 0 259.6066 17.81476 213.5412
2019 20247 0.000001 0.000030 0 314.5257 17.61376 213.9878
2020 20063 0.000002 0.000032 0 216.2718 17.03960 431.5109
Karmøy
Eir/Er
Ein/En
LQ
År Alle Primær Industri Helse Primær Industri Helse Primær Industri Helse
2008 20182 0.0257 0.1830 0.1813 0.0304 0.1014 0.1892 0.8436 1.8057 0.9586
2009 19767 0.0260 0.1629 0.1915 0.0301 0.0960 0.1963 0.8634 1.6981 0.9758
2010 19754 0.0253 0.1459 0.1905 0.0285 0.0902 0.1985 0.8853 1.6167 0.9596
2011 20028 0.0220 0.1411 0.1942 0.0264 0.0895 0.1992 0.8329 1.5764 0.9752
2012 20304 0.0211 0.1396 0.1917 0.0253 0.0885 0.1973 0.8339 1.5770 0.9719
2013 20572 0.0194 0.1366 0.1921 0.0244 0.0882 0.1975 0.7959 1.5497 0.9727
2014 20714 0.0189 0.1358 0.1945 0.0240 0.0875 0.1983 0.7876 1.5520 0.9808
2015 19862 0.0194 0.1335 0.2040 0.0244 0.0830 0.2050 0.7945 1.6081 0.9951
2016 19754 0.0206 0.1326 0.2069 0.0245 0.0797 0.2071 0.8393 1.6643 0.9989
2017 20047 0.0196 0.1338 0.2071 0.0243 0.0783 0.2066 0.8058 1.7100 1.0026
2018 20074 0.0197 0.1340 0.2108 0.0236 0.0778 0.2061 0.8366 1.7213 1.0227
2019 20247 0.0201 0.1345 0.2105 0.0233 0.0778 0.2059 0.8634 1.7301 1.0227
2020 20063 0.0191 0.1358 0.2123 0.0238 0.0771 0.2100 0.8054 1.7608 1.0110

Regionaltnivå Sunnhordaland

Lokalkvotient, region: Sunnhordland
År Alle Jordbruk Industri Vann Bygg Finans Underv. Helse
2008 29445 1.562780 2.063877 1.422696 1.034975 0.423280 0.997247 0.998972
2009 29185 1.558594 2.116018 1.436351 1.081539 0.404942 0.995434 1.009742
2010 28908 1.608714 2.063068 1.461356 1.070067 0.407326 1.010209 1.024944
2011 29332 1.737174 2.053014 1.466935 1.080975 0.380657 1.000001 1.046272
2012 29527 1.739018 2.165045 1.472302 1.040276 0.364909 0.997941 1.049037
2013 29873 1.713035 2.176943 1.419381 1.021741 0.364767 1.004810 1.025411
2014 30051 1.707905 2.189787 1.420744 1.036720 0.363253 1.003540 1.011095
2015 29086 1.844631 2.187086 1.485988 1.085872 0.352748 1.009778 1.021853
2016 28675 1.953790 2.111818 1.470846 1.089257 0.312783 1.025761 1.056156
2017 29079 2.049113 2.118740 1.466815 1.112108 0.300283 0.995529 1.040640
2018 29320 2.116192 2.215000 1.313150 1.126851 0.301181 0.969130 1.042201
2019 29654 2.145199 2.222865 1.340255 1.090133 0.255719 0.947806 1.047000
2020 29369 2.142107 2.229199 1.407657 1.070290 0.261191 0.950786 1.046473
Region: Sunnhordland
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2008 29445 0.000043 0.000154 0 58.40400 9.273062 5142.52351
2009 29185 0.000043 0.000170 0 59.43963 9.337835 522.97127
2010 28908 0.000049 0.000149 0 57.57220 10.423820 201.94226
2011 29332 0.000071 0.000145 0 51.31538 10.609886 108.51379
2012 29527 0.000071 0.000177 0 53.52955 9.694537 103.36437
2013 29873 0.000066 0.000180 0 57.55296 9.636353 199.24829
2014 30051 0.000064 0.000182 0 58.94442 9.608838 454.62880
2015 29086 0.000089 0.000177 0 48.52737 10.145402 223.25622
2016 28675 0.000110 0.000149 0 42.81287 11.290649 85.97281
2017 29079 0.000133 0.000151 0 39.27850 11.420913 119.11675
2018 29320 0.000149 0.000176 0 37.99581 10.576117 114.95231
2019 29654 0.000157 0.000179 0 37.50721 10.515724 103.34678
2020 29369 0.000156 0.000181 0 36.84531 10.546889 102.48422

Kommunale nivå i Sunnhordland

Stord
Stord: Gini & RDI
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2020 9315 0.000004 0.000014 0 63.19494 9.776541 30.17621
2008 9284 0.000006 0.000032 0 50.28797 6.845987 67.67364
2009 9156 0.000006 0.000034 0 53.77525 6.953549 236.83459
2010 8995 0.000006 0.000024 0 55.94438 7.939886 131.16722
2011 9214 0.000005 0.000026 0 64.47141 7.813705 80.69517
2012 9294 0.000005 0.000030 0 64.32861 7.303575 126.64352
2013 9594 0.000006 0.000037 0 62.73749 6.814835 1391.00320
2014 9686 0.000006 0.000048 0 64.01234 6.458425 96.54460
2015 9312 0.000005 0.000045 0 62.47884 6.703168 612.56370
2016 9136 0.000004 0.000030 0 72.67704 8.000233 61.41133
2017 9306 0.000003 0.000030 0 92.66515 8.150315 68.08166
2018 9367 0.000002 0.000030 0 96.49302 8.070974 59.83225
2019 9461 0.000003 0.000032 0 93.83429 8.070992 118.95874
Stord:
Eir/Er
Ein/En
LQ
År Alle Primær Industri Helse Primær Industri Helse Primær Industri Helse
2020 9315 0.0146 0.2037 0.2223 0.0304 0.1014 0.1892 0.4799 2.0091 1.1752
2008 9284 0.0102 0.2420 0.1815 0.0301 0.0960 0.1963 0.3398 2.5222 0.9247
2009 9156 0.0099 0.2341 0.1943 0.0285 0.0902 0.1985 0.3483 2.5936 0.9787
2010 8995 0.0086 0.2155 0.2068 0.0264 0.0895 0.1992 0.3238 2.4071 1.0383
2011 9214 0.0098 0.2165 0.2097 0.0253 0.0885 0.1973 0.3864 2.4455 1.0628
2012 9294 0.0088 0.2251 0.2054 0.0244 0.0882 0.1975 0.3621 2.5529 1.0400
2013 9594 0.0080 0.2342 0.1990 0.0240 0.0875 0.1983 0.3349 2.6776 1.0036
2014 9686 0.0088 0.2379 0.1946 0.0244 0.0830 0.2050 0.3597 2.8648 0.9495
2015 9312 0.0085 0.2288 0.2088 0.0245 0.0797 0.2071 0.3464 2.8727 1.0079
2016 9136 0.0105 0.2033 0.2229 0.0243 0.0783 0.2066 0.4330 2.5971 1.0788
2017 9306 0.0128 0.2005 0.2208 0.0236 0.0778 0.2061 0.5423 2.5766 1.0713
2018 9367 0.0129 0.2017 0.2226 0.0233 0.0778 0.2059 0.5549 2.5933 1.0812
2019 9461 0.0131 0.2010 0.2184 0.0238 0.0771 0.2100 0.5515 2.6063 1.0400
Kvinnherad
Kvinnherad: Gini & RDI
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2020 6426 0.000006 0.000003 0.000001 33.91130 15.423659 15.47467
2008 6769 0.000007 0.000010 0.000000 34.33768 8.729033 35.92204
2009 6679 0.000007 0.000010 0.000000 35.44808 9.183673 38.36807
2010 6599 0.000008 0.000006 0.000000 34.99792 11.818842 35.71691
2011 6601 0.000010 0.000005 0.000000 32.17855 12.754073 26.33049
2012 6519 0.000009 0.000007 0.000000 35.02118 10.377179 25.61857
2013 6485 0.000008 0.000006 0.000000 35.51768 11.647835 33.20765
2014 6494 0.000007 0.000006 0.000000 37.63277 12.030684 43.02561
2015 6300 0.000008 0.000004 0.000000 34.29156 15.627566 26.13257
2016 6190 0.000010 0.000003 0.000000 30.07995 16.705494 19.63051
2017 6282 0.000012 0.000003 0.000000 28.18598 17.204946 27.18925
2018 6337 0.000012 0.000006 0.000000 29.13999 11.818231 27.99519
2019 6417 0.000011 0.000007 0.000000 30.05487 11.773823 27.58081
Kvinnherad:
Eir/Er
Ein/En
LQ
År Alle Primær Industri Helse Primær Industri Helse Primær Industri Helse
2020 6426 0.0599 0.1662 0.2538 0.0304 0.1014 0.1892 1.9693 1.6396 1.3416
2008 6769 0.0592 0.2105 0.2241 0.0301 0.0960 0.1963 1.9669 2.1939 1.1418
2009 6679 0.0567 0.1991 0.2246 0.0285 0.0902 0.1985 1.9886 2.2066 1.1313
2010 6599 0.0550 0.1741 0.2272 0.0264 0.0895 0.1992 2.0809 1.9453 1.1406
2011 6601 0.0564 0.1669 0.2353 0.0253 0.0885 0.1973 2.2294 1.8856 1.1925
2012 6519 0.0529 0.1845 0.2365 0.0244 0.0882 0.1975 2.1718 2.0929 1.1976
2013 6485 0.0521 0.1733 0.2284 0.0240 0.0875 0.1983 2.1748 1.9815 1.1519
2014 6494 0.0510 0.1662 0.2282 0.0244 0.0830 0.2050 2.0892 2.0011 1.1134
2015 6300 0.0537 0.1437 0.2454 0.0245 0.0797 0.2071 2.1908 1.8033 1.1847
2016 6190 0.0575 0.1381 0.2575 0.0243 0.0783 0.2066 2.3699 1.7648 1.2466
2017 6282 0.0591 0.1359 0.2429 0.0236 0.0778 0.2061 2.5047 1.7469 1.1784
2018 6337 0.0576 0.1624 0.2416 0.0233 0.0778 0.2059 2.4740 2.0881 1.1735
2019 6417 0.0570 0.1621 0.2462 0.0238 0.0771 0.2100 2.4001 2.1011 1.1727
Bømlo
Bømlo: Gini & RDI
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2020 5848 0.000007 0.000005 0 29.08302 9.743074 380.02821
2008 5700 0.000004 0.000014 0 38.42869 6.389865 28.97084
2009 5737 0.000004 0.000016 0 37.67003 6.400919 50.80768
2010 5760 0.000006 0.000013 0 34.34025 7.012061 78.74415
2011 5796 0.000006 0.000012 0 35.67080 7.292095 163.33776
2012 5886 0.000008 0.000013 0 33.14759 7.108538 109.98716
2013 5907 0.000007 0.000013 0 34.65795 7.192137 92.12473
2014 5934 0.000007 0.000015 0 34.65616 7.095670 69.57914
2015 5731 0.000009 0.000015 0 29.90300 7.168579 56.70645
2016 5570 0.000011 0.000012 0 26.41931 7.778663 72.71495
2017 5719 0.000013 0.000012 0 24.95726 8.055601 63.61677
2018 5839 0.000014 0.000012 0 24.84031 7.988428 54.00823
2019 5929 0.000012 0.000014 0 26.45622 7.536884 46.00553
Bømlo:
Eir/Er
Ein/En
LQ
År Alle Primær Industri Helse Primær Industri Helse Primær Industri Helse
2020 5848 0.0648 0.2040 0.1866 0.0304 0.1014 0.1892 2.1302 2.0126 0.9861
2008 5700 0.0561 0.2525 0.1618 0.0301 0.0960 0.1963 1.8640 2.6309 0.8241
2009 5737 0.0551 0.2465 0.1788 0.0285 0.0902 0.1985 1.9303 2.7312 0.9009
2010 5760 0.0556 0.2321 0.1865 0.0264 0.0895 0.1992 2.1016 2.5933 0.9362
2011 5796 0.0533 0.2257 0.1912 0.0253 0.0885 0.1973 2.1090 2.5489 0.9690
2012 5886 0.0545 0.2288 0.1884 0.0244 0.0882 0.1975 2.2380 2.5955 0.9540
2013 5907 0.0528 0.2265 0.1874 0.0240 0.0875 0.1983 2.2040 2.5896 0.9452
2014 5934 0.0533 0.2240 0.1906 0.0244 0.0830 0.2050 2.1827 2.6973 0.9299
2015 5731 0.0579 0.2192 0.1895 0.0245 0.0797 0.2071 2.3656 2.7511 0.9149
2016 5570 0.0621 0.2068 0.1928 0.0243 0.0783 0.2066 2.5598 2.6426 0.9334
2017 5719 0.0636 0.2020 0.1904 0.0236 0.0778 0.2061 2.6993 2.5952 0.9237
2018 5839 0.0635 0.2029 0.1874 0.0233 0.0778 0.2059 2.7292 2.6097 0.9101
2019 5929 0.0616 0.2098 0.1882 0.0238 0.0771 0.2100 2.5906 2.7201 0.8965
Sveio
Sveio: Gini & RDI
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2020 2784 0.000001 0 0 38.50668 115.04908 25.94775
2008 2595 0.000002 0 0 27.65244 41.19821 68.87938
2009 2586 0.000003 0 0 22.06313 41.95849 74.68757
2010 2603 0.000002 0 0 27.34555 49.10003 115.21505
2011 2663 0.000002 0 0 29.69336 43.49666 76.91986
2012 2760 0.000003 0 0 25.14942 37.99313 58.86647
2013 2794 0.000003 0 0 27.38115 35.09685 77.47636
2014 2768 0.000001 0 0 39.84591 29.71046 595.69443
2015 2737 0.000003 0 0 23.39849 33.39148 246.93060
2016 2761 0.000003 0 0 25.33080 43.88875 67.90881
2017 2806 0.000003 0 0 27.02303 44.09602 86.12779
2018 2785 0.000002 0 0 29.57667 61.30920 85.34093
2019 2800 0.000003 0 0 27.59650 51.83161 79.76947
Sveio:
Eir/Er
Ein/En
LQ
År Alle Primær Industri Helse Primær Industri Helse Primær Industri Helse
2020 2784 0.0564 0.0927 0.2277 0.0304 0.1014 0.1892 1.8536 0.9143 1.2037
2008 2595 0.0663 0.1202 0.2108 0.0301 0.0960 0.1963 2.2007 1.2530 1.0740
2009 2586 0.0739 0.1141 0.2119 0.0285 0.0902 0.1985 2.5884 1.2641 1.0674
2010 2603 0.0630 0.1099 0.2078 0.0264 0.0895 0.1992 2.3833 1.2275 1.0436
2011 2663 0.0590 0.1115 0.2103 0.0253 0.0885 0.1973 2.3323 1.2597 1.0659
2012 2760 0.0641 0.1145 0.2145 0.0244 0.0882 0.1975 2.6317 1.2985 1.0860
2013 2794 0.0605 0.1160 0.2112 0.0240 0.0875 0.1983 2.5239 1.3257 1.0651
2014 2768 0.0495 0.1167 0.2066 0.0244 0.0830 0.2050 2.0287 1.4054 1.0082
2015 2737 0.0672 0.1096 0.2112 0.0245 0.0797 0.2071 2.7452 1.3759 1.0196
2016 2761 0.0637 0.1011 0.2213 0.0243 0.0783 0.2066 2.6268 1.2911 1.0713
2017 2806 0.0606 0.1005 0.2177 0.0236 0.0778 0.2061 2.5694 1.2914 1.0563
2018 2785 0.0571 0.0941 0.2176 0.0233 0.0778 0.2059 2.4523 1.2097 1.0569
2019 2800 0.0600 0.0964 0.2225 0.0238 0.0771 0.2100 2.5249 1.2501 1.0597

Reginonalt nivå Hardanger

Lokalkvotient, region: Hardanger
År Alle Jordbruk Industri Vann Bygg Finans Underv. Helse
2008 50367 1.075456 1.527397 1.169062 1.017606 0.501835 0.933108 0.996224
2009 49548 1.084237 1.480269 1.158345 1.048055 0.483106 0.971070 1.000013
2010 49793 1.108506 1.434976 1.172909 1.060696 0.469899 0.968415 0.981693
2011 51035 1.129625 1.422513 1.174768 1.120299 0.436547 0.949340 0.983962
2012 51459 1.083943 1.446199 1.175755 1.058730 0.422893 0.964431 0.975939
2013 51940 1.061881 1.447049 1.174457 1.078970 0.398713 0.952646 0.979683
2014 52578 1.040438 1.443355 1.143914 1.069367 0.396168 0.959903 0.991453
2015 50552 1.103504 1.500907 1.112182 1.077831 0.379590 0.957596 1.006411
2016 50296 1.128518 1.529210 1.110672 1.056575 0.377096 0.983459 1.003760
2017 50976 1.115553 1.542237 1.112809 1.059688 0.372480 0.969197 1.011095
2018 51214 1.105522 1.545841 1.066554 1.038641 0.349450 0.977665 1.021492
2019 51670 1.093159 1.578607 1.074577 1.010368 0.327388 0.956960 1.025697
2020 51039 1.099049 1.601510 1.077858 0.991460 0.334849 0.952426 1.026936
Region: Hardanger
GINI
RDI
År Alle Primær Industri Helse Primær Industri Helse
2008 5414 0.000001 0.000004 0 59.96659 10.91063 53.22427
2009 5341 0.000001 0.000004 0 58.60275 10.84496 42.48598
2010 5306 0.000001 0.000004 0 64.24148 11.14303 46.28134
2011 5248 0.000001 0.000005 0 71.62742 10.72620 61.15093
2012 5246 0.000001 0.000005 0 100.13550 10.02045 32.17932
2013 5192 0.000001 0.000005 0 107.09365 10.27692 34.95043
2014 5216 0.000001 0.000004 0 96.59781 10.80464 31.63555
2015 5058 0.000001 0.000005 0 98.02850 10.60330 36.84752
2016 5006 0.000000 0.000004 0 130.33884 12.05639 35.73029
2017 5058 0.000001 0.000005 0 98.68197 11.36289 34.36985
2018 5041 0.000001 0.000005 0 111.67900 10.35743 60.10977
2019 5041 0.000001 0.000006 0 95.76403 10.04206 44.15101
2020 5503 0.000003 0.000007 0 47.34605 10.39235 70.94348

Kommunale nivå i Hardanger

Odda
Warning: Problem with `mutate()` column `Ein_En_Primær`.
ℹ `Ein_En_Primær = nasjo_bos_red$`Jordbruk, Skogbruk og Fiske`/nasjonalt_bosted$`Alle Næringer``.
ℹ longer object length is not a multiple of shorter object length
Error: Problem with `mutate()` column `Ein_En_Primær`.
ℹ `Ein_En_Primær = nasjo_bos_red$`Jordbruk, Skogbruk og Fiske`/nasjonalt_bosted$`Alle Næringer``.
ℹ `Ein_En_Primær` must be size 12 or 1, not 13.
Run `rlang::last_error()` to see where the error occurred.
Ullensvang

3 Sysselsetting i ulike næringer, etter bosted (Modeller under arbeid)

Nå har vi sett på utviklingen av hvor mange som jobber i kommunene etter de 6 mest relevante næringene, fra 2008 til 2020, i regionene Haugalandet, Sunnhordland og Hardanger. Vi har også sett på Gini-koeffisientene og RDI-verdiene til utvalgte kommuner og næringer, samt problemstillingen ved disse verdiene i forhold til dataene våres og aggregeringsnivået vi har.

Videre skal vi nå se på utviklingen for hvor mange som bor i de ulike kommunene i regionene, som jobber innenfor de 6 mest relevante næringene, Gini-koeffisientene og RDI-verdiene for dette. Vi begynner med Haugalandet.

Haugalandet

Figuren viser at det er svingninger i antall ansatte i alle næringer for perioden, med et ca. Gjennomsnitt for perioden på 51.000 antall bosatte på Haugalandet som er sysselsatt i alle næringer. Svingningene varierer fra +/- 1.500 fra gjennomsnittet i perioden, det ser likevel ut til at svingene er stabile og normale ettersom det vil være naturlig med hensyn på at nye bedrifter starter opp i regionen, bedrifter som legger ned eller bedrifter som re-lokaliserer seg et annet sted.

Figuren viser en oversikt over antall ansatte i alle næringer etter kommuner på Haugalandet. Figuren viser at en rimelig stabil og relativt flat kurve for kommunene Utsira og Bokn, samt for Sauda og Vindafjord. For Tysvær viser figuren at det er litt mer svingninger, men de er lave sett i forhold til kommunene Karmøy og Haugesund. De to sistnevnte kommunene er de største i denne forbindelsen av antall ansatte i alle næringer, og de vil derfor også være mer utsatt for svingninger basert på at antall bedrifter er langt høyere, og da med hensyn på at bedrifter som starter opp, legger ned eller som re-lokaliserer seg.

Det vi imidlertid ser er at Haugesund og Karmøy er så store at det påvirker hvordan de mindre kommunene som Bokn, Tysvær, Sauda og Utsira blir fremstilt. Vi velger derfor å skille ut de store og mindre kommunene for seg som vist videre.

Denne figuren sammenligner antall ansatte i alle næringer for kommunene Haugesund, Karmøy og Vindafjord. Figuren viser at i året 2010, er det laveste året for perioden samlet for alle tre kommunene. Videre viser den at året 2014, var det høyeste året for perioden samlet for alle tre kommunene, og likedan viser figuren at fra 2014, har alle kommunene en nedgang frem til 2015-2016 før de tar seg opp igjen i 2018. Alle tre kommunene viser det samme mønsteret.

Denne figuren viser antall ansatte etter bosted i alle næringer for kommunene Bokn, Sauda, Tysvær og Utsira. Kommunene Bokn og Tysvær har siden 2008, hatt en gradvis, men noe ustabil økning i antall ansatte, mens kommunen Sauda og Utsira har hatt en gradvis nedgang i antall ansatte.

For å få en bedre oversikt over regionen så velger vi å se på utviklingen til næringene i kommunene, som vist på figurene under.

Figurene viser antall ansatte etter bosted, fordelt i ulike næringer for kommunene på Haugalandet for perioden 2008 – 2020. Helse- og sosialtjenester er en av de største næringene for alle kommunene og denne er gradvis økende for alle kommunene i perioden. Industri er også blant de største næringene for alle disse kommunene, og denne næringen er gradvis fallende for Haugesund, Karmøy har et enda større fall for denne næringen for perioden, da særlig i perioden 2008-2010. For Vindafjord er denne næringen gradvis økende frem til 2015, før den deretter gradvis faller igjen.

For Haugesund og Karmøy ser vi at næringen jordbruk og skogbruk er særlig lave i antall ansatte, men for Vindafjord er denne næringen betydelig høyere enn Haugesund og Karmøy. For næringen finansiering og forsikring er denne kurven lav og tilnærmet flat i alle kommunene for perioden, og det samme for næringen elektrisitet, vann og renovasjon. Bygg- og anleggsvirksomhet er også lav for Haugesund og Karmøy, men som jordbruk og skogbruk, er denne næringen høyere i Vindafjord sammenlignet mot kommunene Haugesund og Karmøy tatt i betraktning at Vindafjord har et betydelig lavere antall ansatte totalt enn Haugesund og Karmøy har.

Vi ser også samme trendene for de små kommunene på Haugalandet. Helse- og sosiale tjenester har estt en stabil vekst i Bokn, Sauda, Tysvær og utsira, mens industrien har, med unntak av bokn, sett en reduksjon i perioden 2008 - 2020. Utsira skiller seg og ut med å hatt en svak vekst i jordbruk, skogbruk og fiske i denne perioden.

Sunnhordland

Videre vil vi nå se på utviklingen for region Sunnhordland.

Denne figuren viser utviklingen av antall sysselsatte i alle næringer etter bosted i region Sunnhordland fra 2008 til 2020. Vi kan se utfra grafen at regionen hadde en kraftig vekst 2010 - 2014, før den falt kraftig i 2014 - 2016, før regionen igjen har sett en kraftig vekst 2016 - 2019. Ut fra grafen kan det se ut til at regionen igjen står ovenfor en ny reduksjon fra 2019 av.

Vi ønsker å se videre på utviklingen på kommunalt nivå, som vist i figur 24.

Vi ser ut fra grafen her at det er i hovedsak Stord, Kvinnherad og Bømlo som har sett den største svingningene i antall sysselsatte etter bosted. Men vi kan også klart se at disse 3 kommunene alle hadde et fall i 2014, som samsvarer med figur 23. Grafen er imidlertidig igjen ikke tydelig nok på grunn av de store kommunene, og vi fremstiller dermed grafene på kommunalt nivå her og for å tydeligjere utviklingen på kommunalt nivå.

Figur 25 og 26 viser her utviklingen i sysselsatte etter bosted i alle næringer på kommunalt nivå, men nå er hver kommune skilt fra hverandre og vi får et helt annet bilde. Vi ser nå reduksjonen i de tre store kommunene Stord, Kvinnherad og Bømlo mye mer tydelig og hvor drastisk denne reduksjonen har vært. Vi ser også nå at både Etne og Tysnes også har hatt en periode med kraftig reduksjon, med Etne 2014 - 2020 og Tysnes 2008 - 2012. Tysnes har sett en svak vekst fra 2012, mens fitjar såg sterk vekst 2009 - 2014 og har etter 2014 sett en svak reduksjon.

Vi er fortsatt ikke fornøyd, for vi ønsker å se på utviklingen til noen utvalgte næringer i kommunene, og ser dermed videre på figur 27 og 28.

Disse figurene, 27 og 28, viser utviklingen av sysselsatte etter bosted, på kommunalt nivå i Sunnhordlandsregionen 2008 - 2020.

Vi ser nå en trend for Stord, Bømlo og Kvinnherad. Alle disse tre kommunene hadde et kraftig fall i 2014. Kvinnherad hadde allerede en jevn reduksjon i industri frem til 2014, men hadde likevell et kraftig fall her, sammen med Stord og Bømlo. Reduksjonen i industri for Kvinnherad er mest sannsynelig stenging av “B-hallen” på Sør-Norge Aluminium AS i 2008 en av faktorene.

Vi såg akkuratt samme fallet når vi såg på sysselsetting etter arbeidssted tidlegere i rapporten. Dette kommer mest sannsynelig av olje-knekket i 2014. Aker Solutions, som det heter i dag, er blant Sunnhordlands største arbeidsplasser, og det er flere som pendler fra både Kvinnherad og Bømlo som jobber på Aker Solutions. Det er dermed naturlig at dårlige tider i olje-industrien vil påvirke Aker som igjen vil påvirke kommunene som har sysselsette i denne næringa. Vi ser enda et fall i Kvinnherad innen industri i 2016, og dette kommer mest sannsynelig av at Eide Marine Service på Halsnøy blei slått konkurs dette året.

Alle kommunene i region Sunnhordland har også sett en vekst innen helse- og sosialetjenester i perioden 2008 - 2020. Kvinnherad, Bømlo, Stord, Fitjar og Tysnes har sett en vekst innen jordbruk, skogbruk og fiske. Mest sannsynelig er fiske en stor del av veksten da Alsaker Fjordbruk har ekspandert i disse kommunene i denne perioden. Bygge- og Annleggsvirksomhet har også hatt en liten vekst i flere kommuner, mens finans relatert aktivitet har sett en jevn reduksjon i hele regionen.

Hardanger

Siste regionen vi ønsker å se på er Hardanger, mer spesifikt Odda frem til 2019 og Ullensvang frem til 2020. Vi har ikke tatt med Jondal i Hardanger frem til 2019. Igjen så ser vi nå på sysselsetting etter bosted.

Vi ser først på hele regionen samlet, jf. figur 29.

Denne figuren viser utviklingen i sysselsetting etter bosted, i hele regionen, og her er det noe som bør bemerkes. Først og fremst siden Jondal ikke var en del av dataene frem til 2019, men blir tatt med i Ullensvang i 2020 så vil vi se en unaturlig vekst i denne figuren i 2020. Dette er en svakhet i modellen og dataene våres. Det andre er at vi kan se en klar negativ utvikling i Hardanger frem til 2019.

For å illustrere utviklingen bedre, så skiller vi mellom Odda og Ullensvang ved neste figur.

Vi ser nå på denne figuren at både Odda og Ullensvang har hatt en negativ utvikling frem til og med 2019. Vi ser også problemstillingen med å ikke ta med Jondal under Hardanger kommer tydeligere frem nå med en ekstrem vekst etter sammenslåingen mellom Odda, Jondal og Ullensvang i 2020. Før vi velger å se på utvalgte næringer i hver kommune, velger vi først å dele kommunene opp hver for seg, slik at vi kan se utviklingen mer drastisk.

Vi ser her tydelig utviklingen til spessielt Odda, som berre stuper ned, uten tegn til å snu med det første. For å se utviklingen tydligere så deler vi igjen opp i noen utvalgte næringer i hver kommune, jf. figur 32.

Vi ser på denne figuren utviklingen av 6 ulike næringar, med hensyn på syssselsetting etter bosted, i Hardanger i denne perioden. Vi ser samme trender her i Hardanger som vi gjore for både Sunnhordland og Haugalandet: reduksjon i industri og primærnæringane, mens vi ser en vekst i helsetjenester. Det som er litt interessant å bemerke er at Odda såg en vekst i industri fra 2016 til 2019, men grunna sammenslåingen er det vanskelig å si noe om utviklingen for Odda spesifikt i 2020. Igjen så ser vi også samme ekstreme vekst i Ullensvang i 2020 som kommer av sammenslåingen.

Odda er kjent lokalt for sin aldrende befolkning, som mest sannsynelig er en viktig faktor for hvorfor Odda har sett så kraftig reduksjon i sysselsetting etter bosted, samtidig som kommunen har sett en vekst i helsetjenester.

3.1 Lokaliseringskvotienter (Dette er >EGENTLIG< Oppgåve 2 som blir gjort her. Denne og Gini/RDI for oppgåve 2 bør bli byttast om)

Lokaliseringskvotienter for regionene samlet

Nå har vi illustert og sett på grafene for utviklingen i de tre regionene, med hensyn på sysselsetting etter arbeidssted. Videre i rapporten skal vi nå se på Gini-koeffisientene og den regionelle diversifiserings indeksen (RDI) for å vurdere hvor spredt eller konsentrert, samt spesialisert utvlagt næringer er i utvalgte kommuner i regionene.

En generell regel for lokalkvotient-verdier (LQ-verdier) er at visst verdien er over 1 så kan det tyde på at det har oppstått klynger innenfor næringen. En annen regel er at verdier under 1 innenfor næringer som driver med produksjon og eksport så er det oftest en lokal næring. Visst verdien er over 1 så kan det være tegn til at det er en basisnæring.

Disse to argumentene for LQ-verdier vil vi ta med oss videre når vi ser nermere på regionene i sin helhet og utvalgte næringer, samt utvalgte kommuner og næringer i dem.

RDI er et mål for hvorvidt næringsstrukturen er diversifisert og mangfoldig. Høy RDI karakterisert ved mer spesialisert, og motsatt.

Haugalandet 2008-2020

Første regionen vi ser på er Haugalandet.

I denne tabellen så ser vi alle lokalkvotientverdiene(LQ) for 7 utvalgte næringer på Haugalandet. Ut av de 7 utvalgte næringene, så tyder det på at det er klynger i 5 av dem, som er Jordbruk, Skogbruk og Fiske, Industri, Elektrisitet, Vann og Renovasjon, Bygge- og Annleggsvirksomhet, og Helsetjenester. Ut fra tabellen så tyder det på at regionen inneholder basisnæringer innen Industri og Elektrisitet, Vann og Renovasjon, da disse verdiene er langt over 1 og er typiske næringer en kan forvente å være basisnæringer.

Vi ser at industri har hatt størst utvikling fra LQ på 1.55 til 1.75, mens resten av næringene har vært ganske stabile, med untakt av finans som har blitt nesten halvert fra 0.478 til 0.286.

Her ser vi flere faktorer.

Det første og viktigeste vi ser med en gang er GINI-koeffisientene. Vi har en stor svakhet i disse beregninge, som stammer fra aggregeringsnivået vårt. I våre data er primær, industri og helsetjenester en “felles benevnelse”. Det vil si at når vi hentet data fra SSB så skilte ikke SSB næringene innen hver bemerkelse, i tabellen vi brukte som var Tabell 07984. Den har med andre ord slått sammen alt som har med industri å gjøre, f.eks. olje og gass, bergvinning, skipsverft, osv. under en og samme kategori. Dette gjør at alle GINI-koeffisienter vi rekner ut vil være ekstremt små fordi den skiller ikke ut de store ulikhetene mellom næringene innenfor hver bemerkelse. Dette igjen medfører at det er vanskelig å vurdere GINI-koeffisientene optimalt. Dette er desverre et problem som følger oss gjennom rapporten videre på alle regioner og kommuner hvor vi rekner ut GINI-koeffisientene.

Vi ser ut ifra GINI-verdiene våres for Haugalandet at industri har en mye høyere verdi enn primærnæringer og helsetjenester, som tyder på at det er større grad av klyngedannelser av industri i regionen. En annen observasjon verdt å merke seg, er at blant de tre undersøkte næringene, er det kun «Industri» som har stadig hatt sterkere klyngetendenser de siste årene. Dette gjenspeiles av en stadig økende verdi på indeksen over tid. Samme observasjon kan vi ikke se hos primærnæringen eller i helsesektoren.

I regionen, Haugelandet, ser vi at næringsstrukturen i primærnæringene er i stor grad spesialisert. I tillegg tendenserer indeksen til å øke med tid. I de to andre næringene er indeksen relativ jevn, der industri er den laveste og dermed mye mer diversifisert.

Kommunenivå på Haugalandet (Haugesund, Karmøy, Tysvær og Bokn)

Haugesund

Tabellen viser LQ-verdiene for de utvalgte næringene i Haugesund kommune. Det som er verdt å bemerke her er igjen industrien og helsetjenester. Haugesund kommune har sett en kraftig vekst innen industri og helsetjenester, med industri fra 1.19 til 1.38 og helsetjenester fra 1.19 til 1.30. Dette tyder på klyngedannelser innen både industri og helsetjenster i Haugesund, noe som kan stemme mtp. Haugesund Sjukehus som tilbyr tjenester til heile regionen. I tillegg er Haugesund også et industri senter med Haugaland Vekst i front, samt stort fokus på entreprenørskap i kommunen.

I Haugesund kommune viser alle observasjonene små eller tilnærmet ingen endringer over tid. I lys av klyngetendenser, skiller primærnæringene i Haugesund seg ut ved at indeksen synker over tid. Med andre ord viser primærnæringen indikasjoner på at den sprer seg jevnere ut i motsetning til å klynge seg sammen. Det er også verdt å trekke frem at primærnæringene har spesialisert seg med tiden, mens industri- og helsesektoren har blitt mer mangfoldig og diversifisert det siste tiåret.

Bokn

I denne tabellen ser vi LQ-verdien til utvalgte næringer i Bokn kommune. Her ser vi at både primærnæringene og indudstri har sett en svært kraftig vekst i regionen i perioden 2008 - 2020. Under primærnæringer går jordbruk, skogbruk og fiske, og vi kan dermed si at her er det klart tilstedeværelse av klynger innenfor primærnæringene og industrien på bokn. Det tyder også sterkt på at det er tilstedeværelse av basisnæringer i kommunen. Helsetjenester har sett en kraftig reduksjon. En må være observang på en faktor, og det er hvor liten den totale sysselsetningen på bokn er. Dette gjør at en liten endring i antal personer som jobber innen industri vil ha store utslag på LQ-verdiene. Men det er ingen tvil om at Bokn har sett en solid vekst siste perioden.

GINI fra næringene i Bokn har for lave verdiene til å fanges opp i vår metode. RDI fra næringene i Bokn forteller oss at industrisektoren har blitt betraktelig mer diversifisert eller mangfoldig, mens helsevesenet har spesialisert mer årene. Indeksen på de ulike næringene har fluktuerende verdi, men fra 2008 til 2020 er utfallet som nevnt.

Tysvær

I denne tabellen ser vi LQ-verdiene for Tysvær. Vi ser med en gang at Tysvær har sett en enorm vekst innen industri i perioden 2008 - 2020. Med en verdi på 1.71 så tyder det på at det er tilstedeværelse av klynger og basisnæring innen industri i kommunen. Primærnæringene har sett et kraftig fall, samme gjelder også helsetjenester i kommunen.

GINI fra næringene i Tysvær kommune har også lave verdier i vår skala. Vi ser dog at primærnæringene og industrisektoren utvikler seg i motsatt retning av hverandre. Primærnæringene viser små tendenser til å desentralisere seg, mens for de andre næringene mangler vi representativ data.

RDI fra næringene i Tysvær forteller oss at det kun er primærnæringene som har spesialisert seg, mens de to resterende næringene viser stadig synkende verdier over tid som kjennetegnes ved at de blir mer mangfoldig og diversifisert.

Karmøy

I denne tabellen ser vi LQ-verdiene for Karmøy kommune. Ut fra tabellen kan vi se at både primærnæringene og industrien på Karmøy har sett en reduksjon over tid. Primærnæringene ser ut til å bare fortsette å synke, mens industrien har begynt å sjå en liten vekst fra 2014 frem til i dag. Det er klart tilstedeværelse av klynger innen industri på Karmøy og det er definitiv basisnæring der, mtp blant annet Hydro Karmøy. Helsevesenet har gått opp og ned i perioden, men har vert relativt jevnt rundt 1.

I Karmøy mangler vi representativ data for den romlige Gini-indeksen for helsesektoren, men kort oppsummert ser vi klyngetendenser i industrinæringen, men små fluktuasjoner i primærnæringer.

RDI-indeksen viser samme nivå av fluktuasjoner i primærnæringer. Det fremkommer som en spesialisert næringen med små endringer i sammensetning over tid. I Industrien og helsesektoren ser vi derimot økende grad av spesialisering jevnt over tid.

– Oppsummering rundt Haugalandet–

Committings

Sunnhordland 2008-2020

  • Eir_Er_Jordbruk = Samlet sysselsetting i region Sunnhordland
  • Eir_Er_Industri = Samlet sysselsetting innen Industri-sektoren i region Sunnhordland
  • Eir_Er_El_Vann_Reno = Samlet sysselsetting innen Eleketrisitet, Vann og Renovasjon-sektoren i region Sunnhordland
  • Eir_Er_Bygg_og_Anlegg = Samlet sysselsetting innen Bygge- og Anleggsvirksomhet-sektoren i region Sunnhordland
  • Eir_Er_Finans = Samlet sysselsetting innen Finansiering og Forsikring-sektoren i region Sunnhordland
  • Eir_Er_Undervisning = Samlet sysselsetting innen Undervisning-sektoren i region Sunnhordland
  • Eir_Er_Helse = Samlet sysselsetting innen Helse- og Sosialtjenester-sektoren i region Sunnhordland

Kommunenivå i Sunnhordland (Stord, Kvinnherad, Bømlo og Sveio)

Stord
Kvinnherad
Bømlo
Sveio

Hardanger 2008-2020

  • Eir_Er_Jordbruk = Samlet sysselsetting i region Hardanger
  • Eir_Er_Industri = Samlet sysselsetting innen Industri-sektoren i region Hardanger
  • Eir_Er_El_Vann_Reno = Samlet sysselsetting innen Eleketrisitet, Vann og Renovasjon-sektoren i region Hardanger
  • Eir_Er_Bygg_og_Anlegg = Samlet sysselsetting innen Bygge- og Anleggsvirksomhet-sektoren i region Hardanger
  • Eir_Er_Finans = Samlet sysselsetting innen Finansiering og Forsikring-sektoren i region Hardanger
  • Eir_Er_Undervisning = Samlet sysselsetting innen Undervisning-sektoren i region Hardanger
  • Eir_Er_Helse = Samlet sysselsetting innen Helse- og Sosialtjenester-sektoren i region Hardanger

Kommunenivå i Hardanger (Odda og Ullensvang)

Odda
Ullensvang

??Dette ferdig??

– Oppdatert LQ-verdiar

Nasjonalt?? (Dette kan kaaaaaaaaaaaaaaaaaaaaaaanskje bli tatt vekk. Det ser vi etter kvart)

Pendling

De ulike kommunene og regionene har ulike behov, for at regionene skal utvikle seg er pendling et viktig begrep for å tiltrekke seg arbeidskraft. Veldig mange kommuner har for lite arbeidsplasser i forhold til antall arbeidende innbyggere, som vil si at de fleste er avhengige av pendlere. Pendling kan være til andre kommuner i samme region eller til andre regioner. Alle kommuner har kanskje ikke arbeidsplasser innen alle fagfelt, arbeidstakere er derfor avhengig av å pendler til andre kommuner for å finne relevant arbeid. Det samme gjelder dersom arbeidstaker har tilhørighet til en kommune, men det ikke finnes relevant arbeid da er han også nødt til å søke jobb i andre kommuner. Her kommer begrepene innpendling og utpendling inn, som betyr at noen kommuner eller regioner har flere arbeidsplasser tilgjengelige enn de har innbyggere som kan jobbe innad i kommunen eller at de ikke har nok arbeidsplasser og innbyggerene er nødt til å søke jobb andre plasser. Vi skal se på innpendling og utpendling som vil kunne fortelle oss i hvilken grad et sted er integrert i et større arbeidsmarked https://regionalanalyse.no/rapport/3004/1/4.

Nedenfor vil vi først ta for oss regionen Haugalandet og Sunnhordland med Ullensvang, og se på disse regionene hver for seg. Så kommer en tabell som tar for seg disse regionene samlet. Vi ønsker først å skille disse to regionene for å se i hvilken kommune andelen av innpendling og utpendling er størst og minst. For så å se på pendlingen mellom regionene.

I radene sees pendling inn til kommunene. Nederste rad viser totalen av antall pendlere inn til den enkelte kommune. Her kan vi se en andel stillinger som er besatt av arbeidstakere fra andre kommuner i Haugalandsregionen.

I kolonnene ser man de som pendlere ut av hver enkelt kommune. Det vil si arbeidstakere som bor i en kommune, og som har arbeidsted i en annen kommune innenfor Hauglandsregionen.

De som er markert med gult er arbeidstakere som bor og jobber i samme kommune.

Hauglandsregionen:

Haugalandsregionen har 44119 arbeidsplasser, hvorav 13170 er pendlere.

Haugesund, Karmøy og Tysvær er de kommunene i regionen med høyest andel pendlere både når det gjelder inn- og utpendling. La oss se nærmere på Haugesund som har en stor del av arbeidstakerne i regionen. Det gjelder både når vi ser på innpendling, utpendling og de som bor og jobber i samme kommune. Ut ifra tabellen kan vi se at Haugesund har 11714 arbeidstakere som bor og jobber i kommunen. Fra Haugesund er det eksempelvis 1029 arbeidstakere som pendler til Tysvær og 2586 arbeidstakere som pendler til Karmøy. Til Sauda og Utsira er det en betydelig lavere andel som pendler. Grunnen til at det nok at det er mindre kommuner med færre arbeidsplasser. Mange av de som bor i distriktene som eksempelvis Sauda og Utsira jobber og bor i samme kommune. Vi kan se at i Sauda jobber og bor det 1789 arbeidstaker, mens de har 31 stykk som pendler inn til kommunen og 66 stykk som pendler ut av kommunen. Det kan være flere som pendler inn til og ut av kommunen fra andre regioner, men her ser vi tallene på de som pendler i Haugalandsregionen.

Vi vet at Haugesund er regionsentrum med sykehus og høgskole. Samtidig har Haugesund flere olje og sjøfartsnæringer. Det er sentralisert som betyr at det er grunnlag for et større jobbmarked. Det er årsaken til at Haugesund har mer innpendling enn de andre kommunene i regionen. Karmøy og Tysvær som ligger nærmest Haugesund har størst andel utpendling, også til Haugesund.

Sunnhordland

I Sunnhordlandsregionen er det 28275 arbeidstakere om har sin arbeidsplass, av disse er det 2575 som har sitt arbeid i en annen kommune enn den de bor i.

Som vi kan se er Stord den kommunen med flest arbeidstakere. Dette kan vi se i sammenheng med at Stord er som et sentrum for regionen. En del av de interkommunale samarbeidene har sine kontorer lokalisert på Stord. Stord har 7314 som både bor og arbeider innad i kommunen. Å av Stordabuen som pendler ut av kommunen er det flest som pendler til Bømlo og Fitjar. Dette gjelder også motsatt da Stord får flest innpendlere fra de samme kommunene. Stord og Ullensvang er de eneste kommunene som har flere som pendler inn enn ut.

I Etne er det ganske likt med inn og utpendlere da de har 66 som pendler ut og 61 som pendler inn til kommunen. Etne er også den kommunen som har minst arbeidere som driver med pendling.

Vi har valgt å ta med Ullensvang i Sunnhordlandsoversikten. Etne og Kvinnherad er begge nabokommuner til Ullensvang. Ullensvang har lite både inn og utpendling.

En samlet oversikt over Haugalandsregionen og Sunnhordlandsregionen

Vi har sett på inndelingene i de forskjellige regionene. Videre ønsker vi å se på regionene i en samlet tabell.

Vi har tidligere skrevet om at Haugalandsregionen har 13170 pendlere, mens Sunnhordlandsregionen og Ullensvang har 2575 pendlere. Om vi ser begge regionene samlet, øker antall pendlere med totalt 3311 arbeidstakere. Det vil si at det er 3311 stykker som pendler på tvers av regionene.

Utsira har ikke inn- eller utpendlere til Sunnhordland. Bortsett fra en person som pendler til Sveio har heller ikke Bokn utpendling til Sunnhordland.

Haugesund er den kommunen som har flest pendlere inn til kommunen. De ligger langt foran de andre kommunene når det er snakk om pendling inn til kommunene. Karmøy er den kommunen som har flest innbyggere som pendler ut av kommunen.

Videre kan man se på de systematiske forskjellene sett i forhold til sentralitet og tilgjengelighet i det lokale arbeidsmarkedet.

Haugesund, Karmøy og Stord er sentrale kommuner hvor det finnes en stor andel arbeidsplasser og tilgjengeligheten i arbeidsmarkedet er større enn i eksempelvis Sauda, Utsira, Tysnes eller Ullensvang. De sentraliserte kommunene har en fordel i forhold til å skape klynger, det med tanke på at når flere mennesker bosetter seg i samme område kan en dra nytte av kompetansen de innehar. Sauda, Utsira, Tysnes og Ullensvang er eksempler på kommuner i utkanten av regionene. De befinner seg såpass langt utenfor at de ikke vil dra nytte av sentralitet.

I figur 3 og 4 vises det at de siste 10 årene har Haugesund hatt en reduksjon i antall ansatte, men Karmøy, Vindafjord og Tysvær har hatt en markant økning i antall arbeidstakere. Det vi vet er at det har utviklet seg større næringsklynger utenfor Haugesund de siste årene som kan ha en sammenheng med økning i antall ansatte. Samtidig har oljebransjen i samme periode slitt med nedgangstider som påvirker både Haugesund og Stord. Disse kommunene har en del oljebaserte næringer og i de periodene oljemarkedet svinger vil arbeidsmarkedet vise markant nedgang i antall arbeidsplasser. Det vil også vise en betydelig økning i antall arbeidsplasser om det er oppgangstider. Oppgangstider i oljenæringen gir en økning av pendlere inn til kommuner som har virksomheter innenfor oljenæringen.

LS0tCnRpdGxlOiAiQXJiZWlkc2tyYXYgdsOlcmVuIDIwMjIiCmF1dGhvcjoKLSBLZXZpbiBIYQotIE9sYSBBbmRyZSBPbG9mc3NvbgotIEFubiBFbGlzYWJldGggSmFjb2JzZW4KLSBIZWlkaSBNYXJpZSBSb2xmc25lcwotIERhbmllbCBLYXJzdGFkCi0gSGVucmlldHRlIEhhbnNlbgotIFN1c2FubiBCaXJrZWxhbmQgU2l2ZXJ0c2VuCi0gVmlsZGUgSGF1Z2xhbmQKc3VidGl0bGU6IE1TQjEwNiwgQW52ZW5kdCBieS0gb2cgcmVnaW9uYWzDuGtvbm9taQpvdXRwdXQ6CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKbGFuZzogbm8tTkIKZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IHNlbnRlbmNlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeShyZWFkcikKICBsaWJyYXJ5KGdncGxvdDIpCiAgbGlicmFyeShrbml0cikKICBsaWJyYXJ5KHZpcmlkaXMpCiAgbGlicmFyeSh0aWR5dmVyc2UpCiAgbGlicmFyeShrYWJsZUV4dHJhKQogIG9wdGlvbnMoc2NpcGVuID0gOTk5KQogIH0pCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPUZBTFNFLCBpbmNsdWRlID0gVFJVRSkKYGBgCgojIFJvbWxpZ2UgZm9yc2tqZWxsZXIgaSBuw6ZyaW5nc3N0cnVrdHVyLCB2aXJrbmluZ2VyIGF2IGVrc29nZW5lIHNqb2trIGkgYmFzaXNzeXNzZWxzZXR0aW5nZW4sIG9nIGxva2FsZSBmb3Jza2plbGxlciBJIHN5c3NlbHNldHRpbmdzdmVrc3QuCgpJIGRlbm5lIG9wcGdhdmVuIHZpbCB2aSBzZSBww6UgbsOmcmluZ3NzdHJ1a3R1cmVyIHDDpSBIYXVnYWxhbmRldCwgU3VubmhvcmRsYW5kIG9nIFVsbGVuc3ZhbmcuCgpQcm9ibGVtc3RpbGxpbmdlciBvZyBiZXJlZ25pbmdlciB2aSB2aWwgc2UgbsOmcm1lcmUgcMOlCgotICAgQmVza3JpdmUgc2l0dWFzam9uZW4gc2xpayBkZW4gZXIgZm9yIDIwMjAsIG9nIGZvciB1dHZpa2xpbmdlbiBvdmVyIHRpZC4KLSAgIFN5c3NlbHNldHRpbmdzdXR2aWtsaW5nZW4gZm9yIHVsaWtlIG7DpnJpbmdlciBpIHVsaWtlIGtvbW11bmVyIG9nIGZvciByZWdpb25lbiBzYW1sZXQuCi0gICBBbmRlbGVuIGF2IHN5c3NlbHNldHRpbmdlbiBpbm5lbmZvciBlbmtlbHRuw6ZyaW5nZXIsIG9nIHNhbW1lbmxpZ25lIHNpdHVhc2pvbmVuIG9nIHV0dmlrbGluZ2VuIGZvciBsb2thbGUga29tbXVuZXIgb2cgbG9rYWwgcmVnaW9uIG1lZCBkZXQgc29tIGdqZWxkZXIgZm9yIG5hc2pvbmVuIHNhbWxldC4KLSAgIEJlcmVnbmUgbG9rYWxpc2VyaW5nc2t2b3RpZW50ZXIgZm9yIHVsaWtlIG7DpnJpbmdlciBpIHVsaWtlIGtvbW11bmVyLCBvZyBmb3IgcmVnaW9uZW4oZSkgc2FtbGV0LgotICAgQmVyZWduZSB1bGlrZSBhZ2dyZWdlcmluZ3NuaXbDpWVyIGF2IG7DpnJpbmdlciBvZyBnZW9ncmFmaSwgaWRlbnRpZmlzZXIgbXVsaWdlIGtseW5nZXIgYmFzZXJ0IHDDpSB2ZXJkaWVuZSBmb3IgbG9rYWxpc2VyaW5nc2t2b3RpZW50ZW5lLgotICAgR2rDuHJlIGVuIHZ1cmRlcmluZyBhdiBodm9yIGtvbnNlbnRyZXJ0L3NwcmVkdCBlbiBuw6ZyaW5nIGVyIGZvcmRlbHQgbWVsbG9tIGtvbW11bmVuZSBpIHJlZ2lvbmVuLCBiYXNlcnQgcMOlIGJlcmVnbmluZ2VyIGF2IGRlbiByb21saWdlIEdpbmktaW5kZWtzZW4uCi0gICBWdXJkZXJlIG9tIHNhbW1lbmxpZ25pbmdzZ3J1bm5sYWdldCBiw7hyIHbDpnJlIHNhbWxldCBzeXNzZWxzZXR0aW5nIGkgcmVnaW9uZW4sIGVsbGVyIHNhbWxldCBzeXNzZWxzZXR0aW5nIGF2IG5hc2pvbmVuLCBvZyBmaW5uZSB1dCBodmlsa2VuIHJvbGxlIGRldCBzcGlsbGVyIG9tIGVuIGJydWtlciByZWdpb25hbGUgZWxsZXIgbmFzam9uYWxlIGFuc2xhZyBmb3Igc2FtbGV0IHN5c3NlbHNldHRpbmcuCi0gICBGaW5uZSB1dCBvbSBuw6ZyaW5nc3N0cnVrdHVyZW4gaSByZWdpb25lbiBoYXIgYmxpdHQgbWVyIGVsbGVyIG1pbmRyZSBkaXZlcnNpZmlzZXJ0LCBtYW5nZm9sZGlnLCBvdmVyIHRpZC4KLSAgIEJlcmVnbmUgZW4gcmVnaW9uYWwgbWFuZ2ZvbGQtaW5kZWtzIG9nIGZpbm5lIHV0IGh2b3JkYW4gdmVyZGllbmUgcMOlIGVuIHNsaWsgaW5kZWtzIGVyIGVuZHJldCBvdmVyIHRpZC4KLSAgIFZ1cmRlcmUgb20gc3lzc2Vsc2V0dGluZ3NhbmRlbGVuZSBza2FsIHNhbW1lbmxpZ25lcyBtZWQgbmFzam9uYWxlIGVsbGVyIHJlZ2lvbmFsZSBhbmRlbGVyIGZvciBkZSB1bGlrZSBuw6ZyaW5nZW5lCi0gICBHamVudGEgYmVyZWduaW5nZXIgZm9yIGFuZGVsZXIgYXYgYXJiZWlkc3Rha2VyZSBpIHVsaWtlIG7DpnJpbmdlciwgbG9rYWxpc2VyaW5nc2t2b3RpZW50ZXIsIGRlbiByb21saWdlIEdpbmktIGtvZWZmaXNpZW50ZW4gb2cgbcOlbGV0IGZvciBtYW5nZm9sZCBhdiBuw6ZyaW5nZXIsIG1lZCB1dGdhbmdzcHVua3QgaSBkYXRhIHNwZXNpZmlzZXJ0IGV0dGVyIGFyYmVpZHN0YWtlcm5lcyBib3N0ZWQuCi0gICBTYW1tZW5saWduZSByZXN1bHRhdGVuZSBmb3IgZGF0YSBldHRlciBhcmJlaWRzc3RlZCwgb2cga29tbWVudGVyIGh2aWxrZW4gaW5mb3JtYXNqb24gcmVzdWx0YXRlbmUgZ2lyIG9tIHJvbWxpZyBtb2JpbGl0ZXQgaSBhcmJlaWRzbWFya2VkZXQuCi0gICBHaSBlbiBrb3J0IG92ZXJzaWt0IG92ZXIgcGVuZGxlcnN0csO4bW1lciBtZWxsb20ga29tbXVuZW5lIGkgcmVnaW9uZW4KLSAgIEJlcmVnbmUgb2cgcHJlc2VudGVyZSBhbmRlbGVyIGF2IGFyYmVpZHN0YWtlcmUgbWVkIGJvc3RlZCBpIGVuIGtvbW11bmUgc29tIGhhciBhcmJlaWRzc3RlZCBpIGFuZHJlIGtvbW11bmVyLCBvZyBnasO4ciBkZXQgc2FtbWUgZm9yIGFuZGVsZW4gYXYgam9iYmVuZSBpIGVuIGtvbW11bmUgc29tIGVyIGJlc2F0dCBhdiBhcmJlaWRzdGFrZXJlIGZyYSBhbmRyZSBrb21tdW5lci4KLSAgIERpc2t1dGVyZSBmb3Jza2plbGxlciBtZWxsb20ga29tbXVuZW5lIGkgcmVnaW9uZW4sIG9nIGRyw7hmdCB1dHZpa2xpbmdlbiBvdmVyIHRpZCBmb3IgdWxpa2Uga29tbXVuZXIKLSAgIEJlcmVnbmUgb2cgcHJlc2VudGVyZSBhbmRlbGVuIGF2IGFyYmVpZHN0YWtlcmUgc29tIGJvciBvZyBqb2JiZXIgaW5uZW5mb3Igc2FtbWUga29tbXVuZS4gU2Ugb20gZGV0IGVyIHN5c3RlbWF0aXNrZSBmb3Jza2plbGxlciBzZXR0IGkgZm9yaG9sZCB0aWwgc2VudHJhbGl0ZXQgb2cgdGlsZ2plbmdlbGlnaGV0IGkgZGV0IGxva2FsZSBhcmJlaWRzbWFya2VkZXQuIE9nIG9tIGRldCBlciBiZXN0ZW10ZSB0cmVuZGVyIGkgdXR2aWtsaW5nZW4gZm9yIHVsaWtlIGtvbW11bmVyLgotICAgQnJ1a2UgYmVyZWduaW5nZW5lIGF2IGxva2FsaXNlcmluZ2t2b3RpZW50ZXIgdGlsIMOlIGRlbGUgbsOmcmluZ2VuZSBpbm4gaSBsb2thbC0gb2cgYmFzaXNuw6ZyaW5nZXIKLSAgIEZvcm11bGVyZSBlbiDDuGtvbm9taXNrIGJhc2Vtb2RlbGwgb2cgYmVyZWduZSDDuGtvbm9taXNrZSBiYXNlbXVsaXBsaWthdG9yZXIgZm9yIGVua2VsdGtvbW11bmVyIG9nIHJlZ2lvbihlcikuCi0gICBWdXJkZXJlIGxva2FsZSB2aXJrbmluZ2VyIGF2IGFsdGVybmF0aXZlIGxva2FsaXNlcmluZ2VyIGkgT2RkYSwgSHVzbmVzIG9nIExlaXJ2aWsKLSAgIERyw7hmdGUgdmlya25pbmdlciBhdiBldCBzbGlrdCBwb3NpdGl2dCBla3NvZ2VudCBzam9rayBmb3IgZGVuIGxva2FsZSDDuGtvbm9taWVuIGdqZW5ub20gYnJ1ayBhdiBlbiBiYXNlbW9kZWxsCi0gICBGaW5uZSB1dCBodm9yZGFuIHZpcmtuaW5nZW5lIGV2ZW50dWVsdCBzcHJlcyB0aWwgYW5kcmUga29tbXVuZXIgaSByZWdpb25lbiBvZyBodm9yZGFuIGVuIGthbiBicnVrZSBkYXRhIGZvciBwZW5kbGVzdHLDuG1tZXIgdGlsIMOlIHByZWRpa2VyZSB2aXJrbmluZ2VyIHDDpSBzeXNzZWxzZXR0aW5nZW4gaSB1bGlrZSBrb21tdW5lci4KLSAgIFNhbW1lbmxpZ25lIGRpc3NlIHByZWRpa3Nqb25lbmUgbWVkIGRlIHZpIGbDpXIgbsOlciB2aSBnamVubm9tZsO4cmVyIGFuYWx5c2VuIHDDpSByZWdpb25hbHQgbml2w6UuCi0gICBHaSBlbiBzaGlmdC1zaGFyZSBhbmFseXNlIGkgZW4gZGlza3Vzam9uIGF2IGZvcnNramVsbGVyIGkgdmVrc3QgZm9yIGVrc2VtcGVsIG1lbGxvbSBpbmRyZSwgbWlkdHJlIG9nIHl0cmUgZGVsZXIgYXYgcmVnaW9uZW4sIGVsbGVyIGV2ZW50dWVsdCBvbXLDpWRlci9rb21tdW5lciBzb20gaGFyIGhhdHQgc3Rlcmsgb2cgc3ZhayBiZWZvbGtuaW5nc3V0dmlrbGluZy4KCiMjIE92ZXJzaWt0IG92ZXIgYmVmb2xrbmluZ2VuZSBpIHJlZ2lvbmVuZQoKIyMjIEhhdWdhbGFuZGV0CgpIYXVnYWxhbmRldCBiZXN0w6VyIGF2IGtvbW11bmVuZSBCb2tuICg4NTIpLCBIYXVnZXN1bmQgKDM3MzU3KSwgS2FybcO4eSAoNDIxODYpLCBTYXVkYSAoNDU5NSksIFR5c3bDpnIoMTEwNjUpLCBVdHNpcmEoMTk4KSBvZyBWaW5kYWZqb3JkKDg3MTQpLgp0aWxzYW1tZW4gYm9yIGRldCAxMDQ5NjcgcGVyc29uZXIgaSBkZW5uZSByZWdpb25lbi4KaSB0aWRzcGVyaW9kZW4gdmkgaGFyIGhlbnRldCBpbm4gZGF0YSBoYXIgZGV0IHZlcnQga29tbXVuZXNhbW1lbnNsw6VpbmcgaSBkZW5uZSByZWdpb25lbi4KRGEgYmxlIMOYbGVuIG9nIHZpbmRhZmpvcmQgc2zDpXR0IGkgc2FtbWVuIHRpbCBlbiBrb21tdW5lIChodm9yZGFuIGhhciB2aSB0YXR0IGhlbnN5biB0aWwgZGV0dGU/Pz8pCgojIyMgU3VubmhvcmRsYW5kIG9nIFVsbGVuc3ZhbmcKClN1bm5ob3JkbGFuZCBvZyBVbGxlbnN2YW5nIGJlc3TDpXIgYXYga29tbXVuZW5lIELDuG1sbygxMTk1NyksIEV0bmUoNDA2MiksIEZpdGphcigzMTg5KSwgS3Zpbm5oZXJhZCgxMzA3MSksIFN0b3JkKDE4NzU5KSwgU3ZlaW8oNTc2NiksIFR5c25lcygyODY5KSBvZyBVbGxlbnN2YW5nKDExMDQ4KS4KVGlsc2FtbWVuIGJvciBkZXQgNzA3MjEgcGVyc29uZXIgaSBkZW5uZSByZWdpb25lbi4KClRhbGxlbmUgZXIgaGVudGV0IGZyYSBTU0IgMDkuMDEuMjEgKDxodHRwczovL3d3dy5zc2Iubm8vc3RhdGJhbmsvdGFibGUvMDEyMjMvdGFibGVWaWV3TGF5b3V0MS8+KSBnamVsZGVyIGZvciA0IGt2YXJ0YWwgMjAyMC4KCiJGb3JrbGFyIGxpdHQgb20gZGUgZm9yc2tqZWxsaWdlIG7DpnJpbmdlbmUiLi4uLi4gCgpgYGB7ciBjc3ZfZmlsZXJ9CnN5c3NlbF9hcmIgPC0gcmVhZF9jc3YoIkRhdGEvc3lzc2VsX2FyYi5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpobGRfYXJiIDwtIHJlYWRfY3N2KCJEYXRhL2hsZF9hcmIuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKc3VuX2FyYiA8LSByZWFkX2NzdigiRGF0YS9zdW5fYXJiLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmhhcl9hcmIgPC0gcmVhZF9jc3YoIkRhdGEvaGFyX2FyYi5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpzeXNzZWxfYm9zIDwtIHJlYWRfY3N2KCJEYXRhL3N5c3NlbF9ib3MuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKaGxkX2JvcyA8LSByZWFkX2NzdigiRGF0YS9obGRfYm9zLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCnN1bl9ib3MgPC0gcmVhZF9jc3YoIkRhdGEvc3VuX2Jvcy5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpoYXJfYm9zIDwtIHJlYWRfY3N2KCJEYXRhL2hhcl9ib3MuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKUGVuZGxpbmcgPC0gcmVhZF9jc3YoIkRhdGEvUGVuZGxpbmcuY3N2Iiwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKaGdsX1BlbmRsaW5nIDwtIHJlYWRfY3N2KCJEYXRhL2hnbF9QZW5kbGluZy5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQpzdW5fUGVuZGxpbmcgPC0gcmVhZF9jc3YoIkRhdGEvc3VuX1BlbmRsaW5nLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmBgYAoKIyAxIFN5c3NlbHNldHRpbmcgaSB1bGlrZSBuw6ZyaW5nZXIsIGV0dGVyIGFyYmVpZHNzdGVkCgojIyBIYXVnYWxhbmRldAoKRsO4cnN0ZSByZWdpb25lbiB2aSB2ZWxnZXIgw6Ugc2UgcMOlIGVyIEhhdWdhbGFuZGV0LgpIZXIgw7huc2tlciB2aSDDpSBzZSBww6UgdXR2aWtsaW5nZW4gZnJhIDIwMDggdGlsIDIwMjAsIGF2IGFudGFsbCBhbnNhdHRlIGkgc2luIGhlbGhldCBpIHJlZ2lvbmVuLCBzYW10IGRlIDYgbWVzdCByZWxldmFudGUgbsOmcmluZ2VuZS4KCmBgYHtyIEFyYmVpZHNzdGVkX0hhdWdhbGFuZGV0XzF9CmhsZF9hcmIgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMTogSGF1Z2FsYW5kZXQiKSsKICB5bGFiKCJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkKYGBgCgpJIDIwMjAgZXIgZGV0IGkgdW5kZXJrYW50IGF2IDUwIDAwMCBhbnNhdHRlIGkgYWxsZSBuw6ZyaW5nZXIgcMOlIEhhdWdhbGFuZGV0LgpBdiBGaWcuCjEgc2VyIHZpIGF0IEhhdWdhbGFuZGV0IGZpa2sgZW4gbmVkZ2FuZyBpIGFudGFsbCBhbnNhdHRlIGkgMjAxNSBvZyAyMDE2LgpJIDIwMTcgb2cgMjAxOCBibGUgZGV0IHZla3N0LCBmcmVtIHRpbCBkZXQgc251ZGRlIGkgMjAxOSBpZ2plbi4KCmBgYHtyIEFyYmVpZHNzdGVkX0hhdWdhbGFuZGV0XzJ9CnN5c3NlbF9hcmIgJT4lIAogIGZpbHRlcihrbnIgJWluJSBjKDExMDYsIDExMzUsIDExNDUsIDExNDYsIDExNDksIDExNTEsIDExNjApKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IGBBbGxlIE7DpnJpbmdlcmAsIChhbmdsZT0wKSkpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBrbmF2biwgY29sb3VyID0ga25hdm4pKSArCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYyhzZXEoMi4wLCAyLCBieSA9IC0wLjEpKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMjogSGF1Z2FsYW5kZXQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUgaSAgXG4gYWxsZSBuw6ZyaW5nZXIiKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTApKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpJIEZpZy4KMiBzZXIgdmkgYXQgZmxlcmUgYXYga29tbXVuZW5lIHDDpSBIYXVnYWxhbmRldCBoYXIgaGF0dCBsaXRlbiBhcmJlaWRzcGxhc3N2ZWtzdCwgbWVkIHVubnRhayBhdiBUeXN2w6ZyLCBWaW5kYWZqb3JkIG9nIEthcm3DuHkgaSBkZW4gc2lzdGUgdGnDpXJzcGVyaW9kZW4uClZpIHNlciBkZXR0ZSBtZXIgdHlkZWxpZyBww6UgZmlnLgozIG9nIDQuCgpgYGB7ciBobGRfYXJiX2xvbmd9CmhsZF9hcmJfbG9uZyA8LSBzeXNzZWxfYXJiICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBgQWxsZSBOw6ZyaW5nZXJgOlVvcHBnaXR0LAogICAgbmFtZXNfdG8gPSAiTsOmcmluZyIsCiAgICB2YWx1ZXNfdG8gPSAiQW5zYXR0ZSIpCmBgYAoKYGBge3IgTsOmcmluZ19Ub3RhbF9IYXVnYWxhbmRldF8zX1N0w7hyc3RlX0FyYmVpZHN0ZWR9CmhsZF9hcmJfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiSGF1Z2VzdW5kIiwgIkthcm3DuHkiLCAiVmluZGFmam9yZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSAiQWxsZSBOw6ZyaW5nZXIiKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiAzOiBIYXVnYWxhbmRldDogSGF1Z2VzdW5kLCBLYXJtw7h5IG9nIFZpbmRhZmpvcmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDIpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKYGBgCgpgYGB7ciBOw6ZyaW5nX1RvdGFsX0hhdWdhbGFuZGV0XzRfTWluc3RlX0FyYmVpZHN0ZWR9CmhsZF9hcmJfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQm9rbiIsICJTYXVkYSIsICJUeXN2w6ZyIiwgIlV0c2lyYSIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSAiQWxsZSBOw6ZyaW5nZXIiKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiA0OiBIYXVnYWxhbmRldDogQm9rbiwgU2F1ZGEgVHlzdsOmciBvZyBVdHNpcmEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDIpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKYGBgCgpGaWd1ciAzIG9nIDQgdmlzZXIgdXR2aWtsaW5nZW4gYXYgZGV0IHRvdGFsZSBhbnRhbGwgYW5zYXR0ZSBpIGFsbGUgbsOmcmluZ2VyIHDDpSBrb21tdW5hbHQgbml2w6UsIGlubmVuZm9yIEhhdWdhbGFuZC1yZWdpb25lbi4KCkkgZGlzc2UgZmlndXJlbmUsIHPDpSBzZXIgdmkgdHlkZWxpZyBhdCBIYXVnZXN1bmQgaGFyIGhhdHQgcmVkdWtzam9uIGkgYW50YWxsIGFuc2F0dGUgdG90YWx0IHNldHQsIG1lbnMgS2FybcO4eSwgVmluZGFmam9yZCBvZyBUeXN2w6ZyIGhhciBoYXR0IGVuIG1hcmthbnQgdmVrc3QgZGUgc2lzdGUgdGkgw6VyZW5lLgpTaWRlbiBIYXVnZXN1bmQgaGFyIGZsZXN0IGFyYmVpZHNwbGFzc2VyIGJldHlyIHV0dmlrbGluZ2VuIGkgSGF1Z2VzdW5kIG15ZSBmb3IgZGUgc2FtbGVkZSB0YWxsZW5lLgoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX0hhdWdlbGFuZGV0XzNfU3TDuHJzdGVfQXJiZWlkc3N0ZWR9CmhsZF9hcmJfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiSGF1Z2VzdW5kIiwgIkthcm3DuHkiLCAiVmluZGFmam9yZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDU6IEhhdWdhbGFuZGV0OiBIYXVnZXN1bmQsIEthcm3DuHkgb2cgVmluZGFmam9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGF1Z2VsYW5kZXRfNF9NaW5zdGVfQXJiZWlkc3N0ZWR9CmhsZF9hcmJfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQm9rbiIsICJTYXVkYSIsICJUeXN2w6ZyIiwgIlV0c2lyYSIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDY6IEhhdWdhbGFuZGV0OiBCb2tuLCBTYXVkYSwgVHlzdsOmciBvZyBVdHNpcmEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKRmlndXIgNSBvZyA2IHZpc2VyIHV0dmlrbGluZ2VuIGF2IGRlIDYgbWVzdCByZWxldmFudGUgbsOmcmluZ2VuZSBpIEhhdWdhbGFuZHNyZWdpb25lbiBww6Uga29tbXVuZSBuaXbDpS4KClZpIHNlciBpIGRlIHRyZSBzdMO4cnN0ZSBrb21tdW5lbmUsIEhhdWdlc3VuZCwgS2FybcO4eSBvZyBWaW5kYWZqb3JkIHV0Z2rDuHIgbsOmcmluZ2VuZSBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIG9nIEluZHVzdHJpIGRlIHN0w7hyc3RlLgpIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIGhhciB2b2tzdCBqZXZudCBvZyB0cnV0dCBkZSBzaXN0ZSB0acOlcmVuZSwgbWVucyBhbnRhbGwgYW5zYXR0ZSBpIGluZHVzdHJpbsOmcmluZ2VuIGhhciB2YXJpZXJ0IGZyYSBrb21tdW5lIHRpbCBrb21tdW5lLgpJIEhhdWdhbGFuZGV0IHV0Z2rDuHIgcHJpbcOmcm7DpnJpbmdlciAoam9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlKSBlbiBzdMO4cnJlIGFuZGVsLCBlbm4gaG9zIEthcm3DuHkgb2cgSGF1Z2VzdW5kIGh2b3IgcHJpbcOmcm7DpnJpbmdlbmUga3VuIHV0Z2rDuHJlIGVuIGxpdGVuIGFuZGVsLgoKIyMjIFN5c3NlbHNldHRpbmdzdXR2aWtsaW5nZW4gZm9yIHVsaWtlIG7DpnJpbmdlciBpIHVsaWtlIGtvbW11bmVyIG9nIGZvciByZWdpb25lbiBzYW1sZXQuCgpEZXQgZXIgcmVsYXRpdnQgc3RvcmUga29tbXVuZXZpc2UgZm9yc2tqZWxsZXIgaSBuw6ZyaW5nc3N0cnVrdHVyZW4uClJvZ2FsYW5kIGhhciBlbiBmb3Job2xkc3ZpcyBlbnNpZGlnIG7DpnJpbmdzc3RydWt0dXIsIG9samUgb2cgZ2FzcyBlciBkb21pbmVyZW5kZS4KRnlsa2V0IGVyIHN1dmVyZW50IGRvbWluZXJlbmRlIGZvciBmb3NzaWwgZW5lcmdpLgpEZSBoYXIgZm9yIMO4dnJpZyBkZSBzaXN0ZSDDpXJlbmUgc2F0c2V0IHDDpSBldCBlbiBtZXIgZGlmZmVyZW5zaWVydCBuw6ZyaW5nc3N0cnVrdHVyIG9nIG7DpnJpbmdzbGl2IHZlZCDDpSBzYXRzZSBww6UgaGVsc2UsIElLVCBvZyBmb3JueWJhciBlbmVyZ2kuCgpJIHbDpXJlIG1vZGVsbGVyLCBlciBzYXRzaW5nZW4gcMOlIGhlbHNlIGRlbiBtZXN0IHR5ZGVsaWdlLgpBdiByZW50IHRla25pc2tlIGdydW5uZXIgZXIgZGV0IHZhbnNrZWxpZyDDpSBzZSB1dHZpa2xpbmdlbiBpIGVua2VsdGUgbsOmcmluZ2VyIHNvbSB1dGdqw7hyIHNtw6UgYW5kZWxlciwgcMOlIGdydW5uIGF2IHNrYWxhZW4gc29tIGVyIGJlbnl0dGV0LgpUaWwgdHJvc3MgZm9yIGRldHRlLCBrYW4gbWFuIHNlIGF0IG7DpnJpbmdzc3RydWt0dXJlbiBpIHJlZ2lvbmVuIHNhbWxldCBnZW5lcmVsdCBzZXR0IGhhciBlbmRyZXQgc2VnIGxpdGUuCgpSb2dhbGFuZCBoYXIgZ29kZSBqb3JkYnJ1a3NtdWxpZ2hldGVyLCBtZW4gaSBGaWcuCjI6IEhhdWdhbGFuZGV0IHNlciB2aSBlbiBuZWRnYW5nIGkgc3lzc2Vsc2V0dGluZ2VuIGRlIHNpc3RlIHRpw6VyZW5lLCBtZW5zIGRldCBlciBlbiBtYXJnaW5hbCDDuGtuaW5nIGkgU3VubmhvcmRhbGFuZCwgamYuCkZpZyA5LgpJIEZpZy4KMTI6IHNlciB2aSBhdCBUeXNuZXMgaGFyIGhhdHQgZW4gbWFya2FudCDDuGtuaW5nIGkgcHJpbcOmcm7DpnJpbmdlbiwgcmVsYXRpdnQgc2V0dC4KClVuaXZlcnNpdGV0cy0gb2cgaMO4Z3Nrb2xlc2VrdG9yZW4gZXIgbGl0ZW4gaSBSb2dhbGFuZCwgb2cgZGVuIGJlc3TDpXIgZm9yIGRldCBmw7hyc3RlIGF2IFVuaXZlcnNpdGV0ZXQgaSBTdGF2YW5nZXIgKFVpUykgb2cgSMO4Z3NrdWxlbiBww6UgVmVzdGxhbmRldCAoSFZMKSBtZWQgY2FtcHVzIEhhdWdlc3VuZC4KCkhhdWdhbGFuZCBWZWtzdCwgc29tIGVyIGVpZ2QvZHJldmV0IGF2IEhhdWdhbGFuZHNyZWdpb25lbiBlciBpIHNwaXNzZW4gcMOlIMOlIGxlZ2dlIHRpbCByZXR0ZSBmb3Igw6UgZXRhYmxlcmUgbnkgaW5kdXN0cmkgc2FtdCBhbmRyZSBhcmJlaWRzcGxhc3NlciBpIHJlZ2lvbmVuLgoKSSBoZWxzZXNla3RvcmVuIGVyIFN0YXZhbmdlciB1bml2ZXJzaXRldHNzeWtlaHVzIChTdVMpIHNlbnRyYWx0LgoKIyMgU3VubmhvcmRsYW5kCgpWaWRlcmUgw7huc2tlciB2aSDDpSBzZSBww6UgZGVuIHNhbW1lIHV0dmlrbGluZ2VuLCBtZW4gZGVubmUgZ2FuZ2VuIGkgU3VubmhvcmRsYW5kc3JlZ2lvbmVuLgoKYGBge3IgQXJiZWlkc3N0ZWRfU3VubmhvcmRsYW5kXzF9CnN1bl9hcmIgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gNzogU3VubmhvcmRhbGFuZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMSkpCmBgYAoKSGVyIHZpc2VyIGZpZ3VyIDcgdXR2aWtsaW5nZW4gdGlsIGRlbiB0b3RhbGUgc3VtbWVuIGF2IGFuc2F0dGUgaSBTdW5uaG9yZGxhbmRzcmVnaW9uZW4gZnJhIDIwMDggdGlsIDIwMjAuClN1bm5ob3JkYWxhbmQgaGFyIGkgMjAyMCBpIHVuZGVya2FudCBhdiAyNSA1MDAgYW5zYXR0ZS4KVmkgc2VyIHV0IGlmcsOlIGZpZ3VyZW4gYXQgU3VubmhvcmRsYW5kc3JlZ2lvbmVuIGhhZGRlIGVpbiBtYXJrYW50IHZla3N0IGlmcsOlIDIwMDggdGlsIDIwMTQgbWVkIHBlcmlvZGFyIG1lZCBzdmFrIG5lZGdhbmcuCkZyYSAyMDE0IGhhciBkZXQgdsOmcnQgZW4gcmVkdWtzam9uIGkgdG90YWx0IGFudGFsbCBhbnNhdHRlLgoKYGBge3IgQXJiZWlkc3N0ZWRfU3VubmhvcmRsYW5kXzJ9CnN5c3NlbF9hcmIgJT4lIAogIGZpbHRlcihrbnIgJWluJSBjKDQ2MTEsIDQ2MTIsIDQ2MTMsIDQ2MTQsIDQ2MTUsIDQ2MTYsIDQ2MTcpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0ga25hdm4sIGNvbG91ciA9IGtuYXZuKSkgKwogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoc2VxKDIuMCwgMiwgYnkgPSAtMC4xKSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKSArCiAgIGxhYnModGl0bGUgPSAiRmlnLiA4OiBTdW5uaG9yZGxhbmQiLCB4ID0gIsOFciIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpGaWd1ciA4IHZpc2VyIHV0dmlrbGluZ2VuIGF2IHRvdGFsdCBhbnNhdHRlIGkgU3VubmhvcmRsYW5kc3JlZ2lvbmVuIHDDpSBrb21tdW5lbml2w6UgaSBoZWxlIHJlZ2lvbmVuIGZyYSAyMDA4IHRpbCAyMDIwLgpEZW5uZSBmaWd1cmVuIGdpciBvc3MgZW4gb3ZlcnNpa3QsIG1lbiBlciBpa2tlIGhlaWx0IGJydWtlcnZlbm5lbGlnLgpWaSBsYWdlciBkZXJtZWQgZW4gbWVyIG92ZXJzaWt0bGlnIGZpZ3VyLCBqZi4KZmlndXIgOSAmIDEwLgoKYGBge3Igc3VuX2FyYl9sb25nfQpzdW5fYXJiX2xvbmcgPC0gc3lzc2VsX2FyYiAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYEFsbGUgTsOmcmluZ2VyYDpVb3BwZ2l0dCwKICAgIG5hbWVzX3RvID0gIk7DpnJpbmciLAogICAgdmFsdWVzX3RvID0gIkFuc2F0dGUiKQpgYGAKCmBgYHtyIE7DpnJpbmdfVG90YWxfU3VubmhvcmRsYW5kXzNfU3TDuHJzdGVfQXJiZWlkc3RlZH0Kc3VuX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCw7htbG8iLCAiS3Zpbm5oZXJhZCIsICJTdG9yZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSAiQWxsZSBOw6ZyaW5nZXIiKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFhciwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiA5OiBTdW5uaG9yZGxhbmQ6IELDuG1sbywgS3Zpbm5oZXJhZCBvZyBTdG9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpgYGAKCmBgYHtyIE7DpnJpbmdfVG90YWxfU3VubmhvcmRsYW5kXzRfTWluc3RlX0FyYmVpZHN0ZWR9CnN1bl9hcmJfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiRXRuZSIsICJGaXRqYXIiLCAiU3ZlaW8iLCAiVHlzbmVzIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lICJBbGxlIE7DpnJpbmdlciIpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYWFyLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSwgb3B0aW9uID0gIkEiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDEwOiBTdW5uaG9yZGxhbmQ6IEV0bmUsIEZpdGhhciwgU3ZlaW8gb2cgVHlzbmVzIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAyKSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCmBgYAoKVmkgc2VyIGhlciB1dCBpZnJhIGZpZ3VyIDkgb2cgMTAgdXR2aWtsaW5nZW4gZm9yIGh2ZXIgZW5rZWx0IGtvbW11bmUgaSBTdW5uaG9yZGxhbmQgdG90YWx0IHNldHQsIG9nIGhlciBzZXIgdmkgbXllIHR5ZGxpZ2VyZSB1dHZpa2xpbmdlbiBmcmEgMjAwOCB0aWwgMjAyMC4KRW4ga2FuIHNlIGhlciBhdCBLdmlubmhlcmFkLCBFdG5lIG9nIEZpdGphciBoYXIgaGF0dCBlbiByZWR1a3Nqb24gaSB0b3RhbHQgYW5zYXR0ZSwgbWVucyBUeXNuZXMgb2cgU3ZlaW8gaGFyIGhhdHQgZWluIGtyYWZ0aWcgdmVrc3QuCkVuIGludGVyZXNzYW50IGJlbWVya2luZyBlciBTdG9yZCBpIDIwMTQgb2cgS3Zpbm5oZXJhZCBmcmEgMjAwOCB0aWwgMjAxNy4KCkZvciDDpSBmw6UgZXQgYmVkcmUgb3ZlcnNpa3Qgb3ZlciB1dHZpa2xpbmdlbiBpIGtvbW11bmVuIMO4bnNrZXIgdmkgw6Ugc2UgcMOlIGRlIDYgbWVzdCByZWxldmFudGUgbsOmcmluZ2VuZSBpIGh2ZXIga29tbXVuZS4KCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19TdW5uaG9yZGxhbmRfM19TdMO4cnN0ZV9BcmJlaWRzc3RlZH0Kc3VuX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCw7htbG8iLCAiU3RvcmQiLCAiS3Zpbm5oZXJhZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDExOiBTdW5uaG9yZGxhbmQ6IELDuG1sbywgS3Zpbm5oZXJhZCBvZyBTdG9yZCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMDgsIDIwMjAsIGJ5ID0gMikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpgYGAKCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19TdW5uaG9yZGxhbmRfNF9NaW5zdGVfQXJiZWlkc3N0ZWR9CnN1bl9hcmJfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiRXRuZSIsICJTdmVpbyIsICJGaXRqYXIiLCAiVHlzbmVzIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMTI6IFN1bm5ob3JkbGFuZDogRXRuZSwgRml0amFyLCBTdmVpbyBvZyBUeXNuZXMiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKRmlndXIgMTEgb2cgMTIgdmlzZXIgZGUgNiBtZXN0IHJlbGV2YW50ZSBuw6ZyaW5nZW5lIGkgaHZlciBlbmtlbHQga29tbXVuZSBpIFN1bm5ob3JkbGFuZHNyZWdpb25lbiBmcmEgMjAwOCB0aWwgMjAyMC4KCkVuIHNlciB1dCBpZnJhIGZpZ3VyIDExIGF0IGkgZGUgdHJlIHN0w7hyc3RlIGtvbW11bmVuZSwgKkLDuG1sbyosICpLdmlubmhlcmFkKiBvZyAqU3RvcmQqIHPDpSBoYXIgZGUgYWxsZSBoYXR0IGVuIHJlZHVrc2pvbiBpIGluZHVzdHJpZW4sIHNhbXRpZGlnIHNvbSBkZSBoYXIgaGF0dCBlbiB2ZWtzdCBpIGhlbHNlLSBvZyBzb3NpYWx0amVuZXN0ZXIuClR5c25lcyBoYXIgdsOmcnQgc3RhYmlsIG7DpXIgZGV0IGtvbW1lciB0aWwgaW5kdXN0cmksIG1lbiBoYXIgc2V0dCBlaW4gbWFya2FudCB2ZWtzdCBpIHByaW3DpnJuw6ZyaW5nZW4gKEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZSkuCgojIyMgU3lzc2Vsc2V0dGluZ3N1dHZpa2xpbmdlbiBmb3IgdWxpa2UgbsOmcmluZ2VyIGkgdWxpa2Uga29tbXVuZXIgb2cgZm9yIHJlZ2lvbmVuIHNhbWxldC4KCkRldCBmw7hyc3RlIGJlbWVya2Vsc2VzdmVyZGlnZSBpIFN1bm5ob3JkbGFuZHNyZWdpb25lbiBlciBkZW4gbWFya2FudGUgcmVkdWtzam9uZW4gaSBpbmR1c3RyaSBpIFN0b3JkIGtvbW11bmUgaSAyMDE0LCBzYW10IEt2aW5uaGVyYWQgZnJhIDIwMDguCkRldHRlIHN0ZW1tZXIgb3ZlcmVucyBtZWQgdG8gaGVuZGVsc2VyLgpEZW4gZsO4cnN0ZSBlciBvbGpla25la2tlbiBpIDIwMTQgc29tIG1lZGbDuHJ0ZSBhdCBibC5hLgpBa2VyIFN0b3JkIEFTIHNvbSBlciBhdmhlbmdpZyBhdiBPbGplLWluZHVzdHJpZW4gbcOldHRlIHBlcm1pdGVyZS4KClN0b3JkIGVyIGVuIGtvbW11bmUgc29tIGhhciBteWUgb2Zmc2hvcmUgaW5kdXN0cmkuCkkgMjAwOC8yMDA5IHPDpSBzdGVuZ3RlIFPDuHItTm9yZ2UgQWx1bWluaXVtICJCLUhhbGxlbiIgc29tIG1lZGbDuHJ0ZSA1MCUgcmVkdWtzam9uIGkgcHJvZHVrc2pvbiwgb2cgZGVybWVkIGFuc2F0dGUuCkludGVyZXNzYW50IMOlIGJlbWVya2UgYXQgaSBLdmlubmhlcmFkIHPDpSBlciBhbnRhbGwgaW5kdXN0cmlhcmJlaWRlcmUgcmVkdXNlcnQgc2FtdGlkaWcgc29tIGFudGFsbCBhbnNhdHRlIGkgSGVsc2UtIG9nIFNvc2lhbGV0amVuZXN0ZXIgw7hrdC4KQsO4bWxvIGhhciBvZ3PDpSBzZXR0IGVuIHN0YWJpbCByZWR1a3Nqb24gaSBhbnNhdHRlIGlubmVuIGluZHVzdHJpLCBzYW10IHZla3N0IGkgSGVsc2UtIG9nIFNvc2lhbGV0amVuZXN0ZXIgZnJlbSB0aWwgMjAxOC4KClNlciBlbiBww6UgaGVsZSBTdW5uaG9yZGxhbmRzcmVnaW9uZW4gaSBzaW4gaGVsaGV0LCBzw6Ugc2VyIHZpIGVuIHN2w6ZydCB0eWRlbGlnIHZla3N0IGlubmVuIEhlbHNlLSBvZyBTb3NpYWxldGplbmVzdGVyLCBvZyByZWR1a3Nqb24gaW5uZW4gaW5kdXN0cmkgaSBoZWxlIHJlZ2lvbmVuLgpLdmlubmhlcmFkLCBUeXNuZXMgb2cgRml0amFyIGhhciBvcHBsZXZkIGVpbiBtYXJrYW50IHZla3N0IGlubmVuIHByaW3DpnJuw6ZyaW5nLgoqKkthbiBkZXQgdmVyZSBlaW4gZ3J1bm4gdGlsIGRldHRlIHNvbSBidXJkZSBkaXNrdXRlcmFzdD8/KioKCiMgRm9ydHNldHQgSGVyIChPQSwgS0gpCgojIyBIYXJkYW5nZXIKClRpbCBzbHV0dCBtw6UgdmkgZ2plcmUgZGV0IHNhbW1lIG1lZCAqSGFyZGFuZ2VyKgoKSSBoZW5ob2xkIHRpbCBvcHBnYXZlbnMga3JhdiB0aWwgYmV0cmFrdGVyIHZpICpIYXJkYW5nZXIqIGbDuHIgMjAxOSBzb20gVWxsZW5zdmFuZy0gb2cgT2RkYSBrb21tdW5lIHNvbSB0byBzZXBhcmVydGUga29tbXVuZXIuCmkgMjAyMCBzw6UgYmxlIFVsbGVuc3ZhbmcsIE9kZGEgb2cgSm9uZGFsIHNsw6V0dCBzYW1tZW4gdGlsIFVsbGVuc3ZhbmcuCkRldHRlIGZvcmtsYXJlciBkZW4gdm9sZHNvbW1lIMO4a25pbmdlbiBpIHN5c3NlbHNldHRpbmcgaSByZWdpb25lbiB2ZWQgdGlkc3B1bmt0ZXQgZm9yIGtvbW11bmVzYW1tZW5zbMOlaW5nLgoKYGBge3IgQXJiZWlkc3N0ZWRfSGFyZGFuZ2VyXzF9Cmhhcl9hcmIgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMTM6IEhhcmRhbmdlciIsIHk9ICJBbGxlIE7DpnJpbmdlciIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDIpKQpgYGAKCmBgYHtyIEFyYmVpZHNzdGVkX0hhcmRhbmdlcl8yfQpzeXNzZWxfYXJiICU+JSAKICBmaWx0ZXIoa25yICVpbiUgYyg0NjE4LCAxMjI4KSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyMxMTExMTEnLCcjMDU0OTg3JykpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKwogICBsYWJzKHRpdGxlID0gIkZpZy4gMTQ6IEhhcmRhbmdlciIsIHggPSAiw4VyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIGhhcl9hcmJfbG9uZ30KaGFyX2FyYl9sb25nIDwtIHN5c3NlbF9hcmIgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGBBbGxlIE7DpnJpbmdlcmA6VW9wcGdpdHQsCiAgICBuYW1lc190byA9ICJOw6ZyaW5nIiwKICAgIHZhbHVlc190byA9ICJBbnNhdHRlIikKYGBgCgpgYGB7ciBOw6ZyaW5nX1RvdGFsX0hhcmRhbmdlcl9BcmJlaWRzdGVkfQpoYXJfYXJiX2xvbmcgJT4lIAogIGZpbHRlcihrbmF2biAlaW4lIGMoIk9kZGEiLCAiVWxsZW5zdmFuZyIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSAiQWxsZSBOw6ZyaW5nZXIiKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiAxNTogSGFyZGFuZ2VyOiBPZGRhIG9nIFVsbGVuc3ZhbmciLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX0hhcmRhbmdlcl9BcmJlaWRzc3RlZH0KaGFyX2FyYl9sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJPZGRhIiwgIlVsbGVuc3ZhbmciKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiAxNjogSGFyZGFuZ2VyOiBPZGRhLCBVbGxlbnN2YW5nIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKClVsbGVuc3Zhbmcga29tbXVuZSBoYXIgc3RvciBrcmFmdHByb2R1a3Nqb24gb2cgaG92ZWRuw6ZyaW5nZW4gZXIgaW5kdXN0cmkuCk1ham9yaXRldGVuIGF2IGtyYWZ0cHJvZHVrc2pvbmVuIGZvcmVnw6VyIGkgdGlkbGlnZXJlIE9kZGEuCk9kZGEgZXIgZXQgZW5zaWRpZyBpbmR1c3RyaXN0ZWQsIG1lbiBoYXIgb2dzw6UgZW4gbWFyaXRpbSBuw6ZyaW5nIGkgdGlsbGVnZy4KSSBmaWd1ciAxNiBzZXIgdmkgYXQgaW5kdXN0cmluw6ZyaW5nZW4gdXRnasO4ciBlbiBiZXRyYWt0ZWxpZyBzdMO4cnJlIGFuZGVsIGF2IHN5c3NlbHNldHRpbmdlbiBpIGhlci4KSW5kdXN0cmluw6ZyaW5nZW4gZXIgb2dzw6Ugb21mYXR0ZXQgb2cgYnlnZy0gb2cgYW5sZWdnc3Zpcmtzb21oZXQuClDDpSBtb3RzYXR0IHNpZGUgZXIgam9yZGJydWssIGhlbHNlLSBvZyBzb3NpYWx0amVuZXN0ZXIgZG9taW5lcmVuZGUgaSBVbGxlbnN2YW5nLgoKKipHZW5lcmVsdCBvbSBVbGxlbnN2YW5nIGtvbW11bmUqKgoKVWxsZW5zdmFuZyBrb21tdW5lIChtZWQgT2RkYSkgaGFyIGhhdHQgZW4gamV2biBvZyBuZWdhdGl2IGJlZm9sa25pbmdzdmVrc3QgaSBtYW5nZSB0acOlci4KRGV0IGdqZW5zcGVpbGVzIGlra2UgdHlkZWxpZyBpIHbDpXJlIG1vZGVsbGVyIHDDpSBncnVubiBhdiBza2FsYWVuIHNvbSBlciBicnVrdC4KSSB0aWxsZWdnIGhhciB2aSBpa2tlIGhlbnN5bnRhdHQgaW5udmFuZHJlbmRlIGFyYmVpZGVyZSwgZWxsZXIgbWlkbGVydGlkaWdlIGZyYWZseXR0ZWRlIHNvbSBmb3IgZWtzZW1wZWwgc3R1ZGVudGVyLgoKIyAyIChEZXR0ZSBlciA+RUdFTlRMSUc8IHNpc3RlIGRlbCBhdiBvcHBnw6V2ZSAzLiBEZW5uZSBvZyBHaW5pL1JESSBmb3Igb3BwZ8OldmUgMyBiw7hyIGJsaSBieXR0YXN0IG9tKQoKRmlubmVyIGxva2FsaXNlcmluZ3Nrdm90aWVudGVyIGZvciB1bGlrZSBuw6ZyaW5nZXIgaSB1bGlrZSBrb21tdW5lciwgb2cgZm9yIHJlZ2lvbmVuIHNhbWxldAoKYGBge3J9CiNvcmRuZXIgZXR0ZXIga29tbXVuZW5hdm4gb2cgw6VyCnRtcCA8LSBzeXNzZWxfYm9zCmBgYAoKYGBge3J9CmhhdTIwIDwtIHN5c3NlbF9ib3MgJT4lIAogIGZpbHRlcihhYXIgPT0gIjIwMjAiLCBrbmF2biA9PSAiSGF1Z2VzdW5kIikKYGBgCgpgYGB7cn0KKGhhdTIwJEluZHVzdHJpL2hhdTIwJGBBbGxlIE7DpnJpbmdlcmApCjE5MDUvMTgxMzcKYGBgCgpgYGB7cn0KbHFfc3lzc2VsX2JvcyA8LSBzeXNzZWxfYm9zICU+JSAKICBtdXRhdGUoRWlyX0VyX2luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0pvcmRicnVrID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCkKYGBgCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCm5hc2pvbmFsdF9ib3N0ZWQgPC0gcmVhZF9leGNlbCgiRGF0YS9uYXNqb25hbHRfYm9zdGVkLnhsc3giKQpgYGAKCmBgYHtyfQpuYXNqb25hbHRfYm9zdGVkIDwtIG5hc2pvbmFsdF9ib3N0ZWQgJT4lIAogIG11dGF0ZShFaW5fRW5fSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaW5fRW5fSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaW5fRW5fVW5kZXJ2aXNuaW5nID0gVW5kZXJ2aXNuaW5nL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpbl9Fbl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgKQpgYGAKCgpgYGB7cn0KTFFfYm9zX0pvcmRicnVrIDwtIGxxX3N5c3NlbF9ib3MlPiUgCiAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9Kb3JkYnJ1aykgJT4lIAogIG11dGF0ZShhYXIgPSBhcy5jaGFyYWN0ZXIoYWFyKSkgJT4lIAogIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYm9zdGVkLCBhYXIsIEVpbl9Fbl9Kb3JkYnJ1ayksIGJ5ID0gYygiYWFyIikpICU+JSAKICBtdXRhdGUoYW5kZWwgPSBFaXJfRXJfSm9yZGJydWsvRWluX0VuX0pvcmRicnVrCiAgKQoKTFFfYm9zX0luZHVzdHJpIDwtIGxxX3N5c3NlbF9ib3MgJT4lIAogIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfaW5kdXN0cmkpICU+JSAKICBtdXRhdGUoYWFyID0gYXMuY2hhcmFjdGVyKGFhcikpICU+JSAKICBsZWZ0X2pvaW4oc2VsZWN0KC5kYXRhID0gbmFzam9uYWx0X2Jvc3RlZCwgYWFyLCBFaW5fRW5fSW5kdXN0cmkpLCBieSA9IGMoImFhciIpKSAlPiUgCiAgbXV0YXRlKGFuZGVsID0gRWlyX0VyX2luZHVzdHJpL0Vpbl9Fbl9JbmR1c3RyaSkKCgpMUV9ib3NfVW5kZXJ2aXNuaW5nIDwtIGxxX3N5c3NlbF9ib3MgJT4lIAogIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfVW5kZXJ2aXNuaW5nKSAlPiUgCiAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgCiAgbGVmdF9qb2luKHNlbGVjdCguZGF0YSA9IG5hc2pvbmFsdF9ib3N0ZWQsIGFhciwgRWluX0VuX1VuZGVydmlzbmluZyksIGJ5ID0gYygiYWFyIikpICU+JSAKICBtdXRhdGUoYW5kZWwgPSBFaXJfRXJfVW5kZXJ2aXNuaW5nL0Vpbl9Fbl9VbmRlcnZpc25pbmcpCgoKTFFfYm9zX0hlbHNlIDwtIGxxX3N5c3NlbF9ib3MgJT4lIAogIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfSGVsc2UpICU+JSAKICBtdXRhdGUoYWFyID0gYXMuY2hhcmFjdGVyKGFhcikpICU+JSAKICBsZWZ0X2pvaW4oc2VsZWN0KC5kYXRhID0gbmFzam9uYWx0X2Jvc3RlZCwgYWFyLCBFaW5fRW5fSGVsc2UpLCBieSA9IGMoImFhciIpKSAlPiUgCiAgbXV0YXRlKGFuZGVsID0gRWlyX0VyX0hlbHNlL0Vpbl9Fbl9IZWxzZSkKYGBgCgpgYGB7cn0Kc3lzc2VsX2JvcyA8LSBzeXNzZWxfYm9zICU+JSAKICBtdXRhdGUoTFFfYm9zX0pvcmRicnVrID0gTFFfYm9zX0pvcmRicnVrJGFuZGVsLAogICAgICAgICBMUV9ib3NfSW5kdXN0cmkgPSBMUV9ib3NfSW5kdXN0cmkkYW5kZWwsCiAgICAgICAgIExRX2Jvc19VbmRlcnZpc25pbmcgPSBMUV9ib3NfVW5kZXJ2aXNuaW5nJGFuZGVsLAogICAgICAgICBMUV9ib3NfSGVsc2UgPSBMUV9ib3NfSGVsc2UkYW5kZWwpCmBgYAoKYGBge3J9CkxRX2JvcyA8LSBzeXNzZWxfYm9zICU+JSAKICBzZWxlY3QoYWFyLCBrbmF2biwgTFFfYm9zX0pvcmRicnVrLCBMUV9ib3NfSW5kdXN0cmksIExRX2Jvc19VbmRlcnZpc25pbmcsIExRX2Jvc19IZWxzZSkKYGBgCgpgYGB7cn0KTFFfYm9zW2lzLm5hKExRX2JvcyldID0gMApgYGAKCgoKRm9yIHJlZ2lvbiBIYXVnYWxhbmQ6CgpgYGB7ciBobGRfYm9zX0Vpcl9Fcn0KaGxkX2Jvc19MUSA8LSBobGRfYm9zICU+JSAKICBtdXRhdGUoRWlyX0VyX0pvcmRicnVrID0gYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0VsX1Zhbm5fUmVubyA9IGBFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbmAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0J5Z2dfb2dfQW5sZWdnID0gYEJ5Z2dlLSBvZyBBbm5sZWdnc3Zpcmtzb21oZXRgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9GaW5hbnMgPSBgRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmdgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBVbmRlcnZpc25pbmcvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBFaW5fRW5fSm9yZGJydWsgPSBuYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKCiAgICAgICAgIEVpbl9Fbl9JbmR1c3RyaSA9IG5hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAoKICAgICAgICAgRWluX0VuX0VsX1Zhbm5fUmVubyA9IG5hc2pvbmFsdF9ib3N0ZWQkYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBFaW5fRW5fQnlnZ19vZ19BbmxlZ2cgPSBuYXNqb25hbHRfYm9zdGVkJGBCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXRgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9GaW5hbnMgPSBuYXNqb25hbHRfYm9zdGVkJGBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZ2AvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICAKICAgICAgICAgRWluX0VuX1VuZGVydmlzbmluZyA9IG5hc2pvbmFsdF9ib3N0ZWQkVW5kZXJ2aXNuaW5nL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9IZWxzZSA9IG5hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfSm9yZGJydWsvRWluX0VuX0pvcmRicnVrLAogICAgICAgICBMUV9JbmR1c3RyaSA9IEVpcl9Fcl9JbmR1c3RyaS9FaW5fRW5fSW5kdXN0cmksCiAgICAgICAgIExRX0VsX1Zhbm5fUmVubyA9IEVpcl9Fcl9FbF9WYW5uX1Jlbm8vRWluX0VuX0VsX1Zhbm5fUmVubywKICAgICAgICAgTFFfQnlnZ19vZ19BbmxlZ2cgPSBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cvRWluX0VuX0J5Z2dfb2dfQW5sZWdnLAogICAgICAgICBMUV9GaW5hbnMgPSBFaXJfRXJfRmluYW5zL0Vpbl9Fbl9GaW5hbnMsCiAgICAgICAgIExRX1VuZGVydmlzbmluZyA9IEVpcl9Fcl9VbmRlcnZpc25pbmcvRWluX0VuX1VuZGVydmlzbmluZywKICAgICAgICAgTFFfSGVsc2UgPSBFaXJfRXJfSGVsc2UvRWluX0VuX0hlbHNlCikgJT4lIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9FbF9WYW5uX1Jlbm8sIExRX0J5Z2dfb2dfQW5sZWdnLCBMUV9GaW5hbnMsIExRX1VuZGVydmlzbmluZywgTFFfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZShobGRfYm9zX0xRLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSm9yZGJydWsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFubiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCeWdnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbmFucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmRlcnYuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiTG9rYWxrdm90aWVudCwgcmVnaW9uOiBIYXVnYWxhbmRldCI9OSkpCmBgYAoKCiMjIyBHSU5JIFJlZ2lvbmFsdG5pdsOlCiMjIyMgSGF1Z2FsYW5kZXQKCgpgYGB7cn0KaGxkX2Jvc19HSU5JIDwtIGhsZF9ib3MgJT4lIAogIG11dGF0ZSgKICAgIEdJTklfUHJpbcOmciA9ICgoaGxkX2JvcyRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC0gaGxkX2JvcyRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSW5kdXN0cmkgPSAoKGhsZF9ib3MkSW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaSAtIGhsZF9ib3MkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0hlbHNlID0gKChobGRfYm9zJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYCAtIGhsZF9ib3MkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQpgYGAKCmBgYHtyfQpobGRfYm9zX0dJTkkgPC0gaGxkX2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBSRElfUHJpbcOmciA9IDEgLyBhYnMoaGxkX2JvcyRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIGhsZF9ib3MkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9JbmR1c3RyaSA9IDEgLyBhYnMoaGxkX2JvcyRJbmR1c3RyaSAvIGhsZF9ib3MkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9IZWxzZSA9IDEgLyBhYnMoaGxkX2JvcyRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvaGxkX2JvcyRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApKSAlPiUgCiAgCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZShobGRfYm9zX0dJTkksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkhhdWdhbGFuZGV0Ij04KSkKYGBgCgojIyMgR0lOSSBLb21tdW5hbHQgbml2w6UKIyMjIyBIYXVnZXN1bmQKCmBgYHtyfQpIYXVnX2Jvc19HSU5JIDwtIHN5c3NlbF9ib3MgJT4lIAogIGZpbHRlcihrbnIgJWluJSAiMTEwNiIpCmBgYAoKYGBge3J9CkhhdWdfYm9zX0dJTkkgPC0gSGF1Z19ib3NfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgRWlyX0VyX1ByaW3DpnIgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fUHJpbcOmciA9IG5hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgRWluX0VuX0luZHVzdHJpID0gbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaS9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICBFaW5fRW5fSGVsc2UgPSBuYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfUHJpbcOmciAvIEVpbl9Fbl9Qcmltw6ZyLAogICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkgLyBFaW5fRW5fSW5kdXN0cmksCiAgICBMUV9IZWxzZSA9IEVpcl9Fcl9IZWxzZSAvIEVpbl9Fbl9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTQpCmBgYAoKYGBge3J9Cm5hbWVzKEhhdWdfYm9zX0dJTkkpW1s1XV0gPC0gIsOFciIKYGBgCgpgYGB7cn0KSGF1Z19ib3NfR0lOSSA8LSBIYXVnX2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKEhhdWdfYm9zX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIEhhdWdfYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0luZHVzdHJpID0gKChIYXVnX2Jvc19HSU5JJEluZHVzdHJpL25hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkgLSBIYXVnX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9IZWxzZSA9ICgoSGF1Z19ib3NfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBIYXVnX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0KSGF1Z19ib3NfR0lOSSA8LSBIYXVnX2Jvc19HSU5JICU+JQogIG11dGF0ZSgKICAgIFJESV9Qcmltw6ZyID0gMSAvIGFicyhIYXVnX2Jvc19HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgIC8gSGF1Z19ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhIYXVnX2Jvc19HSU5JJEluZHVzdHJpIC8gSGF1Z19ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpIC8gbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0hlbHNlID0gMSAvIGFicyhIYXVnX2Jvc19HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9IYXVnX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkpICU+JSAKICAKICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpCmBgYAoKYGBge3J9CmthYmxlKAogIEhhdWdfYm9zX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJHSU5JIiA9IDMsICJSREkiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkhhdWdlc3VuZDogR2luaSAmIFJESSI9OCkpCgprYWJsZSgKICBIYXVnX2Jvc19HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkVpci9FciIgPSAzLCAiRWluL0VuIiA9IDMsICJMUSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiSGF1Z2VzdW5kOiBMb2thbGt2b3RpZW50Ij0xMSkpCmBgYAojIyMgR0lOSSBLb21tdW5hbHQgbml2w6UKIyMjIyBCb2tuCgpgYGB7cn0KQm9rbl9ib3NfR0lOSSA8LSBzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgIjExNDUiKQpgYGAKCmBgYHtyfQpCb2tuX2Jvc19HSU5JIDwtIEJva25fYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIEVpcl9Fcl9Qcmltw6ZyID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgRWluX0VuX1ByaW3DpnIgPSBuYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpbl9Fbl9JbmR1c3RyaSA9IG5hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgRWluX0VuX0hlbHNlID0gbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBMUV9Qcmltw6ZyID0gRWlyX0VyX1ByaW3DpnIgLyBFaW5fRW5fUHJpbcOmciwKICAgIExRX0luZHVzdHJpID0gRWlyX0VyX0luZHVzdHJpIC8gRWluX0VuX0luZHVzdHJpLAogICAgTFFfSGVsc2UgPSBFaXJfRXJfSGVsc2UgLyBFaW5fRW5fSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz00KQpgYGAKCmBgYHtyfQpuYW1lcyhCb2tuX2Jvc19HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9CkJva25fYm9zX0dJTkkgPC0gQm9rbl9ib3NfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgR0lOSV9Qcmltw6ZyID0gKChCb2tuX2Jvc19HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBCb2tuX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9JbmR1c3RyaSA9ICgoQm9rbl9ib3NfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpIC0gQm9rbl9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKEJva25fYm9zX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gQm9rbl9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMikpCmBgYAoKYGBge3J9CkJva25fYm9zX0dJTkkgPC0gQm9rbl9ib3NfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKEJva25fYm9zX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBCb2tuX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gYWJzKEJva25fYm9zX0dJTkkkSW5kdXN0cmkgLyBCb2tuX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkgLyBuYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSGVsc2UgPSAxIC8gYWJzKEJva25fYm9zX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL0Jva25fYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSkgJT4lIAogIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoCiAgQm9rbl9ib3NfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiQm9rbjogR2luaSAmIFJESSI9OCkpCgprYWJsZSgKICBCb2tuX2Jvc19HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkVpci9FciIgPSAzLCAiRWluL0VuIiA9IDMsICJMUSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiQm9rbiI9MTEpKQpgYGAKIyMjIEdJTkkgS29tbXVuYWx0IG5pdsOlCiMjIyMgVHlzdsOmcgoKYGBge3J9ClR5c3ZfYm9zX0dJTkkgPC0gc3lzc2VsX2JvcyAlPiUgCiAgZmlsdGVyKGtuciAlaW4lICIxMTQ2IikKYGBgCgpgYGB7cn0KVHlzdl9ib3NfR0lOSSA8LSBUeXN2X2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBFaXJfRXJfUHJpbcOmciA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9Qcmltw6ZyID0gbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpbl9Fbl9IZWxzZSA9IG5hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfUHJpbcOmciAvIEVpbl9Fbl9Qcmltw6ZyLAogICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkgLyBFaW5fRW5fSW5kdXN0cmksCiAgICBMUV9IZWxzZSA9IEVpcl9Fcl9IZWxzZSAvIEVpbl9Fbl9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTQpCmBgYAoKYGBge3J9Cm5hbWVzKFR5c3ZfYm9zX0dJTkkpW1s1XV0gPC0gIsOFciIKYGBgCgpgYGB7cn0KVHlzdl9ib3NfR0lOSSA8LSBUeXN2X2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKFR5c3ZfYm9zX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIFR5c3ZfYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0luZHVzdHJpID0gKChUeXN2X2Jvc19HSU5JJEluZHVzdHJpL25hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkgLSBUeXN2X2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9IZWxzZSA9ICgoVHlzdl9ib3NfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBUeXN2X2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0KVHlzdl9ib3NfR0lOSSA8LSBUeXN2X2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBSRElfUHJpbcOmciA9IDEgLyBhYnMoVHlzdl9ib3NfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYCAvIFR5c3ZfYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9JbmR1c3RyaSA9IDEgLyBhYnMoVHlzdl9ib3NfR0lOSSRJbmR1c3RyaSAvIFR5c3ZfYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9IZWxzZSA9IDEgLyBhYnMoVHlzdl9ib3NfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvVHlzdl9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApKSAlPiUgCiAgCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZSgKICBUeXN2X2Jvc19HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJUeXN2w6ZyOiBHaW5pICYgUkRJIj04KSkKCmthYmxlKAogIFR5c3ZfYm9zX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiRWlyL0VyIiA9IDMsICJFaW4vRW4iID0gMywgIkxRIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJUeXN2w6ZyIj0xMSkpCmBgYAojIyMgR0lOSSBLb21tdW5hbHQgbml2w6UKIyMjIyBLYXJtw7h5CgpgYGB7cn0KS2FybV9ib3NfR0lOSSA8LSBzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgIjExNDkiKQpgYGAKCmBgYHtyfQpLYXJtX2Jvc19HSU5JIDwtIEthcm1fYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIEVpcl9Fcl9Qcmltw6ZyID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgRWluX0VuX1ByaW3DpnIgPSBuYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpbl9Fbl9JbmR1c3RyaSA9IG5hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgRWluX0VuX0hlbHNlID0gbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgTFFfUHJpbcOmciA9IEVpcl9Fcl9Qcmltw6ZyIC8gRWluX0VuX1ByaW3DpnIsCiAgICBMUV9JbmR1c3RyaSA9IEVpcl9Fcl9JbmR1c3RyaSAvIEVpbl9Fbl9JbmR1c3RyaSwKICAgIExRX0hlbHNlID0gRWlyX0VyX0hlbHNlIC8gRWluX0VuX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NCkKYGBgCgpgYGB7cn0KbmFtZXMoS2FybV9ib3NfR0lOSSlbWzVdXSA8LSAiw4VyIgpgYGAKCmBgYHtyfQpLYXJtX2Jvc19HSU5JIDwtIEthcm1fYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIEdJTklfUHJpbcOmciA9ICgoS2FybV9ib3NfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9uYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC0gS2FybV9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSW5kdXN0cmkgPSAoKEthcm1fYm9zX0dJTkkkSW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaSAtIEthcm1fYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0hlbHNlID0gKChLYXJtX2Jvc19HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYCAtIEthcm1fYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQpgYGAKCmBgYHtyfQpLYXJtX2Jvc19HSU5JIDwtIEthcm1fYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIFJESV9Qcmltw6ZyID0gMSAvIGFicyhLYXJtX2Jvc19HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgIC8gS2FybV9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhLYXJtX2Jvc19HSU5JJEluZHVzdHJpIC8gS2FybV9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpIC8gbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0hlbHNlID0gMSAvIGFicyhLYXJtX2Jvc19HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9LYXJtX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkpICU+JSAKICAKICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpCmBgYAoKYGBge3J9CmthYmxlKAogIEthcm1fYm9zX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJHSU5JIiA9IDMsICJSREkiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkthcm3DuHk6IEdpbmkgJiBSREkiPTgpKQoKa2FibGUoCiAgS2FybV9ib3NfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJFaXIvRXIiID0gMywgIkVpbi9FbiIgPSAzLCAiTFEiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkthcm3DuHkiPTExKSkKYGBgCiMjIyBSZWdpb25hbHRuaXbDpSBTdW5uaG9yZGFsYW5kCgoKYGBge3Igc3VuX2Jvc19FaXJfRXJ9CnN1bl9ib3NfTFEgPC0gc3VuX2JvcyAlPiUgCiAgbXV0YXRlKEVpcl9Fcl9Kb3JkYnJ1ayA9IGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9FbF9WYW5uX1Jlbm8gPSBgRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb25gL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9CeWdnX29nX0FubGVnZyA9IGBCeWdnZS0gb2cgQW5ubGVnZ3N2aXJrc29taGV0YC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfRmluYW5zID0gYEZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfVW5kZXJ2aXNuaW5nID0gVW5kZXJ2aXNuaW5nL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICAKICAgICAgICAgRWluX0VuX0pvcmRicnVrID0gbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCgogICAgICAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKCiAgICAgICAgIEVpbl9Fbl9FbF9WYW5uX1Jlbm8gPSBuYXNqb25hbHRfYm9zdGVkJGBFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICAKICAgICAgICAgRWluX0VuX0J5Z2dfb2dfQW5sZWdnID0gbmFzam9uYWx0X2Jvc3RlZCRgQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0YC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBFaW5fRW5fRmluYW5zID0gbmFzam9uYWx0X2Jvc3RlZCRgRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmdgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9VbmRlcnZpc25pbmcgPSBuYXNqb25hbHRfYm9zdGVkJFVuZGVydmlzbmluZy9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBFaW5fRW5fSGVsc2UgPSBuYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBMUV9Qcmltw6ZyID0gRWlyX0VyX0pvcmRicnVrL0Vpbl9Fbl9Kb3JkYnJ1aywKICAgICAgICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkvRWluX0VuX0luZHVzdHJpLAogICAgICAgICBMUV9FbF9WYW5uX1Jlbm8gPSBFaXJfRXJfRWxfVmFubl9SZW5vL0Vpbl9Fbl9FbF9WYW5uX1Jlbm8sCiAgICAgICAgIExRX0J5Z2dfb2dfQW5sZWdnID0gRWlyX0VyX0J5Z2dfb2dfQW5sZWdnL0Vpbl9Fbl9CeWdnX29nX0FubGVnZywKICAgICAgICAgTFFfRmluYW5zID0gRWlyX0VyX0ZpbmFucy9FaW5fRW5fRmluYW5zLAogICAgICAgICBMUV9VbmRlcnZpc25pbmcgPSBFaXJfRXJfVW5kZXJ2aXNuaW5nL0Vpbl9Fbl9VbmRlcnZpc25pbmcsCiAgICAgICAgIExRX0hlbHNlID0gRWlyX0VyX0hlbHNlL0Vpbl9Fbl9IZWxzZQopICU+JSAKICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfRWxfVmFubl9SZW5vLCBMUV9CeWdnX29nX0FubGVnZywgTFFfRmluYW5zLCBMUV9VbmRlcnZpc25pbmcsIExRX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoc3VuX2Jvc19MUSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpvcmRicnVrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbm4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQnlnZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaW5hbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5kZXJ2LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkxva2Fsa3ZvdGllbnQsIHJlZ2lvbjogU3VubmhvcmRsYW5kIj05KSkKCmBgYAoKYGBge3J9CnN1bl9ib3NfR0lOSSA8LSBzdW5fYm9zICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKHN1bl9ib3MkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIHN1bl9ib3MkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0luZHVzdHJpID0gKChzdW5fYm9zJEluZHVzdHJpL25hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkgLSBzdW5fYm9zJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9IZWxzZSA9ICgoc3VuX2JvcyRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBzdW5fYm9zJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0Kc3VuX2Jvc19HSU5JIDwtIHN1bl9ib3NfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKHN1bl9ib3MkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBzdW5fYm9zJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApLAogIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhzdW5fYm9zJEluZHVzdHJpIC8gc3VuX2JvcyRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpIC8gbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAKICAgIFJESV9IZWxzZSA9IDEgLyBhYnMoc3VuX2JvcyRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvc3VuX2JvcyRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApKSAlPiUgCiAgCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZShzdW5fYm9zX0dJTkksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJSZWdpb246IFN1bm5ob3JkbGFuZCI9OCkpCmBgYAoKCgoKIyMjIyBLb21tdW5hbGUgbml2w6UgaSBTdW5uaG9yZGxhbmQgCgojIyMjIyBTdG9yZAoKYGBge3J9ClN0b3JkX2Jvc19HSU5JIDwtIHN5c3NlbF9ib3MgJT4lIAogIGZpbHRlcihrbnIgJWluJSAiNDYxNCIpCmBgYAoKYGBge3J9ClN0b3JkX2Jvc19HSU5JIDwtIFN0b3JkX2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBFaXJfRXJfUHJpbcOmciA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9Qcmltw6ZyID0gbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpbl9Fbl9IZWxzZSA9IG5hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgTFFfUHJpbcOmciA9IEVpcl9Fcl9Qcmltw6ZyIC8gRWluX0VuX1ByaW3DpnIsCiAgICBMUV9JbmR1c3RyaSA9IEVpcl9Fcl9JbmR1c3RyaSAvIEVpbl9Fbl9JbmR1c3RyaSwKICAgIExRX0hlbHNlID0gRWlyX0VyX0hlbHNlIC8gRWluX0VuX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NCkKYGBgCgpgYGB7cn0KbmFtZXMoU3RvcmRfYm9zX0dJTkkpW1s1XV0gPC0gIsOFciIKYGBgCgpgYGB7cn0KU3RvcmRfYm9zX0dJTkkgPC0gU3RvcmRfYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIEdJTklfUHJpbcOmciA9ICgoU3RvcmRfYm9zX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIFN0b3JkX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9JbmR1c3RyaSA9ICgoU3RvcmRfYm9zX0dJTkkkSW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaSAtIFN0b3JkX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9IZWxzZSA9ICgoU3RvcmRfYm9zX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gU3RvcmRfYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQpgYGAKCmBgYHtyfQpTdG9yZF9ib3NfR0lOSSA8LSBTdG9yZF9ib3NfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKFN0b3JkX2Jvc19HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgIC8gU3RvcmRfYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9JbmR1c3RyaSA9IDEgLyBhYnMoU3RvcmRfYm9zX0dJTkkkSW5kdXN0cmkgLyBTdG9yZF9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpIC8gbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0hlbHNlID0gMSAvIGFicyhTdG9yZF9ib3NfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvU3RvcmRfYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSkgJT4lIAogIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoCiAgU3RvcmRfYm9zX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJHSU5JIiA9IDMsICJSREkiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlN0b3JkOiBHaW5pICYgUkRJIj04KSkKCmthYmxlKAogIFN0b3JkX2Jvc19HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkVpci9FciIgPSAzLCAiRWluL0VuIiA9IDMsICJMUSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiU3RvcmQ6ICI9MTEpKQpgYGAKCgojIyMjIyBLdmlubmhlcmFkCgpgYGB7cn0KS3Zpbm5fYm9zX0dJTkkgPC0gc3lzc2VsX2JvcyAlPiUgCiAgZmlsdGVyKGtuciAlaW4lICI0NjE3IikKYGBgCgpgYGB7cn0KS3Zpbm5fYm9zX0dJTkkgPC0gS3Zpbm5fYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIEVpcl9Fcl9Qcmltw6ZyID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgRWluX0VuX1ByaW3DpnIgPSBuYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpbl9Fbl9JbmR1c3RyaSA9IG5hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgRWluX0VuX0hlbHNlID0gbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBMUV9Qcmltw6ZyID0gRWlyX0VyX1ByaW3DpnIgLyBFaW5fRW5fUHJpbcOmciwKICAgIExRX0luZHVzdHJpID0gRWlyX0VyX0luZHVzdHJpIC8gRWluX0VuX0luZHVzdHJpLAogICAgTFFfSGVsc2UgPSBFaXJfRXJfSGVsc2UgLyBFaW5fRW5fSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz00KQpgYGAKCmBgYHtyfQpuYW1lcyhLdmlubl9ib3NfR0lOSSlbWzVdXSA8LSAiw4VyIgpgYGAKCmBgYHtyfQpLdmlubl9ib3NfR0lOSSA8LSBLdmlubl9ib3NfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgR0lOSV9Qcmltw6ZyID0gKChLdmlubl9ib3NfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9uYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC0gS3Zpbm5fYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0luZHVzdHJpID0gKChLdmlubl9ib3NfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpIC0gS3Zpbm5fYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0hlbHNlID0gKChLdmlubl9ib3NfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBLdmlubl9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMikpCmBgYAoKYGBge3J9Ckt2aW5uX2Jvc19HSU5JIDwtIEt2aW5uX2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBSRElfUHJpbcOmciA9IDEgLyBhYnMoS3Zpbm5fYm9zX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBLdmlubl9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhLdmlubl9ib3NfR0lOSSRJbmR1c3RyaSAvIEt2aW5uX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkgLyBuYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSGVsc2UgPSAxIC8gYWJzKEt2aW5uX2Jvc19HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9Ldmlubl9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApKSAlPiUgCiAgCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZSgKICBLdmlubl9ib3NfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiS3Zpbm5oZXJhZDogR2luaSAmIFJESSI9OCkpCgprYWJsZSgKICBLdmlubl9ib3NfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJFaXIvRXIiID0gMywgIkVpbi9FbiIgPSAzLCAiTFEiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkt2aW5uaGVyYWQ6ICI9MTEpKQpgYGAKCiMjIyMjIELDuG1sbwoKYGBge3J9CkLDuG1sb19ib3NfR0lOSSA8LSBzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgIjQ2MTMiKQpgYGAKCmBgYHtyfQpCw7htbG9fYm9zX0dJTkkgPC0gQsO4bWxvX2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBFaXJfRXJfUHJpbcOmciA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9Qcmltw6ZyID0gbmFzam9uYWx0X2Jvc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpbl9Fbl9IZWxzZSA9IG5hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgTFFfUHJpbcOmciA9IEVpcl9Fcl9Qcmltw6ZyIC8gRWluX0VuX1ByaW3DpnIsCiAgICBMUV9JbmR1c3RyaSA9IEVpcl9Fcl9JbmR1c3RyaSAvIEVpbl9Fbl9JbmR1c3RyaSwKICAgIExRX0hlbHNlID0gRWlyX0VyX0hlbHNlIC8gRWluX0VuX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NCkKYGBgCgpgYGB7cn0KbmFtZXMoQsO4bWxvX2Jvc19HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9CkLDuG1sb19ib3NfR0lOSSA8LSBCw7htbG9fYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIEdJTklfUHJpbcOmciA9ICgoQsO4bWxvX2Jvc19HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBCw7htbG9fYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0luZHVzdHJpID0gKChCw7htbG9fYm9zX0dJTkkkSW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaSAtIELDuG1sb19ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKELDuG1sb19ib3NfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBCw7htbG9fYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQpgYGAKCmBgYHtyfQpCw7htbG9fYm9zX0dJTkkgPC0gQsO4bWxvX2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBSRElfUHJpbcOmciA9IDEgLyBhYnMoQsO4bWxvX2Jvc19HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgIC8gQsO4bWxvX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gYWJzKELDuG1sb19ib3NfR0lOSSRJbmR1c3RyaSAvIELDuG1sb19ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpIC8gbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0hlbHNlID0gMSAvIGFicyhCw7htbG9fYm9zX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL0LDuG1sb19ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApKSAlPiUgCiAgCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZSgKICBCw7htbG9fYm9zX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJHSU5JIiA9IDMsICJSREkiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkLDuG1sbzogR2luaSAmIFJESSI9OCkpCgprYWJsZSgKICBCw7htbG9fYm9zX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiRWlyL0VyIiA9IDMsICJFaW4vRW4iID0gMywgIkxRIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJCw7htbG86Ij0xMSkpCmBgYAoKIyMjIyMgU3ZlaW8KCmBgYHtyfQpTdmVpb19ib3NfR0lOSSA8LSBzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgIjQ2MTIiKQpgYGAKCmBgYHtyfQpTdmVpb19ib3NfR0lOSSA8LSBTdmVpb19ib3NfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgRWlyX0VyX1ByaW3DpnIgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fUHJpbcOmciA9IG5hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgRWluX0VuX0luZHVzdHJpID0gbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaS9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICBFaW5fRW5fSGVsc2UgPSBuYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfUHJpbcOmciAvIEVpbl9Fbl9Qcmltw6ZyLAogICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkgLyBFaW5fRW5fSW5kdXN0cmksCiAgICBMUV9IZWxzZSA9IEVpcl9Fcl9IZWxzZSAvIEVpbl9Fbl9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTQpCmBgYAoKYGBge3J9Cm5hbWVzKFN2ZWlvX2Jvc19HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9ClN2ZWlvX2Jvc19HSU5JIDwtIFN2ZWlvX2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKFN2ZWlvX2Jvc19HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBTdmVpb19ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSW5kdXN0cmkgPSAoKFN2ZWlvX2Jvc19HSU5JJEluZHVzdHJpL25hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkgLSBTdmVpb19ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKFN2ZWlvX2Jvc19HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYCAtIFN2ZWlvX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0KU3ZlaW9fYm9zX0dJTkkgPC0gU3ZlaW9fYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIFJESV9Qcmltw6ZyID0gMSAvIGFicyhTdmVpb19ib3NfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYCAvIFN2ZWlvX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gYWJzKFN2ZWlvX2Jvc19HSU5JJEluZHVzdHJpIC8gU3ZlaW9fYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9IZWxzZSA9IDEgLyBhYnMoU3ZlaW9fYm9zX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL1N2ZWlvX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkpICU+JSAKICAKICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpCmBgYAoKYGBge3J9CmthYmxlKAogIFN2ZWlvX2Jvc19HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJTdmVpbzogR2luaSAmIFJESSI9OCkpCgprYWJsZSgKICBTdmVpb19ib3NfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJFaXIvRXIiID0gMywgIkVpbi9FbiIgPSAzLCAiTFEiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlN2ZWlvOiI9MTEpKQpgYGAKCgojIyMgUmVnaW5vbmFsdCBuaXbDpSBIYXJkYW5nZXIKCmBgYHtyIGhhcl9ib3NfRWlyX0VyfQpoYXJfYm9zX0xRIDwtIGhhcl9ib3MgJT4lIAogIG11dGF0ZShFaXJfRXJfSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cgPSBgQnlnZ2UtIG9nIEFubmxlZ2dzdmlya3NvbWhldGAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0ZpbmFucyA9IGBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZ2AvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9Kb3JkYnJ1ayA9IG5hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAoKICAgICAgICAgRWluX0VuX0luZHVzdHJpID0gbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaS9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCgogICAgICAgICBFaW5fRW5fRWxfVmFubl9SZW5vID0gbmFzam9uYWx0X2Jvc3RlZCRgRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb25gL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9CeWdnX29nX0FubGVnZyA9IG5hc2pvbmFsdF9ib3N0ZWQkYEJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldGAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICAKICAgICAgICAgRWluX0VuX0ZpbmFucyA9IG5hc2pvbmFsdF9ib3N0ZWQkYEZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBFaW5fRW5fVW5kZXJ2aXNuaW5nID0gbmFzam9uYWx0X2Jvc3RlZCRVbmRlcnZpc25pbmcvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICAKICAgICAgICAgRWluX0VuX0hlbHNlID0gbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICAKICAgICAgICAgTFFfUHJpbcOmciA9IEVpcl9Fcl9Kb3JkYnJ1ay9FaW5fRW5fSm9yZGJydWssCiAgICAgICAgIExRX0luZHVzdHJpID0gRWlyX0VyX0luZHVzdHJpL0Vpbl9Fbl9JbmR1c3RyaSwKICAgICAgICAgTFFfRWxfVmFubl9SZW5vID0gRWlyX0VyX0VsX1Zhbm5fUmVuby9FaW5fRW5fRWxfVmFubl9SZW5vLAogICAgICAgICBMUV9CeWdnX29nX0FubGVnZyA9IEVpcl9Fcl9CeWdnX29nX0FubGVnZy9FaW5fRW5fQnlnZ19vZ19BbmxlZ2csCiAgICAgICAgIExRX0ZpbmFucyA9IEVpcl9Fcl9GaW5hbnMvRWluX0VuX0ZpbmFucywKICAgICAgICAgTFFfVW5kZXJ2aXNuaW5nID0gRWlyX0VyX1VuZGVydmlzbmluZy9FaW5fRW5fVW5kZXJ2aXNuaW5nLAogICAgICAgICBMUV9IZWxzZSA9IEVpcl9Fcl9IZWxzZS9FaW5fRW5fSGVsc2UKKSAlPiUgCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0VsX1Zhbm5fUmVubywgTFFfQnlnZ19vZ19BbmxlZ2csIExRX0ZpbmFucywgTFFfVW5kZXJ2aXNuaW5nLCBMUV9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpCmBgYAoKYGBge3J9CmthYmxlKGhsZF9ib3NfTFEsCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJKb3JkYnJ1ayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYW5uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ5Z2ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiRmluYW5zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZGVydi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJMb2thbGt2b3RpZW50LCByZWdpb246IEhhcmRhbmdlciI9OSkpCgpgYGAKCmBgYHtyfQpoYXJfYm9zX0dJTkkgPC0gaGFyX2JvcyAlPiUgCiAgbXV0YXRlKAogICAgR0lOSV9Qcmltw6ZyID0gKChoYXJfYm9zJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBoYXJfYm9zJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9JbmR1c3RyaSA9ICgoaGFyX2JvcyRJbmR1c3RyaS9uYXNqb25hbHRfYm9zdGVkJEluZHVzdHJpIC0gaGFyX2JvcyRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKGhhcl9ib3MkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gaGFyX2JvcyRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMikpCmBgYAoKYGBge3J9Cmhhcl9ib3NfR0lOSSA8LSBoYXJfYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIFJESV9Qcmltw6ZyID0gMSAvIGFicyhoYXJfYm9zJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gaGFyX2JvcyRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYm9zdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAKICAgIFJESV9JbmR1c3RyaSA9IDEgLyBhYnMoaGFyX2JvcyRJbmR1c3RyaSAvIGhhcl9ib3MkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgCiAgICBSRElfSGVsc2UgPSAxIC8gYWJzKGhhcl9ib3MkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2hhcl9ib3MkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSkgICU+JQogIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoaGFyX2Jvc19HSU5JLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiUmVnaW9uOiBIYXJkYW5nZXIiPTgpKQpgYGAKCgojIyMjIEtvbW11bmFsZSBuaXbDpSBpIEhhcmRhbmdlcgoKIyMjIyMgT2RkYQoKYGBge3J9Cm5hc2pvX2Jvc19yZWQgPC0gbmFzam9uYWx0X2Jvc3RlZCAlPiUgCiAgZmlsdGVyKGFhciAlaW4lIGMoMjAwODoyMDE5KSkKYGBgCgpgYGB7cn0KT2RkYV9ib3NfR0lOSSA8LSBzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgIjEyMjgiKQpgYGAKCmBgYHtyfQpPZGRhX2Jvc19HSU5JIDwtIE9kZGFfYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIEVpcl9Fcl9Qcmltw6ZyID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgRWluX0VuX1ByaW3DpnIgPSBuYXNqb19ib3NfcmVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpbl9Fbl9JbmR1c3RyaSA9IG5hc2pvX2Jvc19yZWQkSW5kdXN0cmkvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgRWluX0VuX0hlbHNlID0gbmFzam9fYm9zX3JlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBMUV9Qcmltw6ZyID0gRWlyX0VyX1ByaW3DpnIgLyBFaW5fRW5fUHJpbcOmciwKICAgIExRX0luZHVzdHJpID0gRWlyX0VyX0luZHVzdHJpIC8gRWluX0VuX0luZHVzdHJpLAogICAgTFFfSGVsc2UgPSBFaXJfRXJfSGVsc2UgLyBFaW5fRW5fSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz00KQpgYGAKCmBgYHtyfQpuYW1lcyhPZGRhX2Jvc19HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9Ck9kZGFfYm9zX0dJTkkgPC0gT2RkYV9ib3NfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgR0lOSV9Qcmltw6ZyID0gKChPZGRhX2Jvc19HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvX2Jvc19yZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBPZGRhX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9fYm9zX3JlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9JbmR1c3RyaSA9ICgoT2RkYV9ib3NfR0lOSSRJbmR1c3RyaS9uYXNqb19ib3NfcmVkJEluZHVzdHJpIC0gT2RkYV9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvX2Jvc19yZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKE9kZGFfYm9zX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvX2Jvc19yZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gT2RkYV9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvX2Jvc19yZWQkYEFsbGUgTsOmcmluZ2VyYCleMikpCmBgYAoKYGBge3J9Ck9kZGFfYm9zX0dJTkkgPC0gT2RkYV9ib3NfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKE9kZGFfYm9zX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBPZGRhX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvX2Jvc19yZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb19ib3NfcmVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gYWJzKE9kZGFfYm9zX0dJTkkkSW5kdXN0cmkgLyBPZGRhX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvX2Jvc19yZWQkSW5kdXN0cmkgLyBuYXNqb19ib3NfcmVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSGVsc2UgPSAxIC8gYWJzKE9kZGFfYm9zX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL09kZGFfYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9fYm9zX3JlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9fYm9zX3JlZCRgQWxsZSBOw6ZyaW5nZXJgKSkgJT4lIAogIAogIHNlbGVjdCggw4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpCmBgYAoKYGBge3J9CmthYmxlKAogIE9kZGFfYm9zX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJHSU5JIiA9IDMsICJSREkiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIk9kZGEoLTIwMTkpOiBHaW5pICYgUkRJIj04KSkKCmthYmxlKAogIE9kZGFfYm9zX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiRWlyL0VyIiA9IDMsICJFaW4vRW4iID0gMywgIkxRIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJPZGRhKC0yMDE5KSI9MTEpKQpgYGAKCiMjIyMjIFVsbGVuc3ZhbmcKCmBgYHtyfQpVbGxlbl9ib3NfR0lOSSA8LSBzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgIjQ2MTgiKQpgYGAKCmBgYHtyfQpVbGxlbl9ib3NfR0lOSSA8LSBVbGxlbl9ib3NfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgRWlyX0VyX1ByaW3DpnIgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fUHJpbcOmciA9IG5hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgRWluX0VuX0luZHVzdHJpID0gbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaS9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICBFaW5fRW5fSGVsc2UgPSBuYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfUHJpbcOmciAvIEVpbl9Fbl9Qcmltw6ZyLAogICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkgLyBFaW5fRW5fSW5kdXN0cmksCiAgICBMUV9IZWxzZSA9IEVpcl9Fcl9IZWxzZSAvIEVpbl9Fbl9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTQpCmBgYAoKYGBge3J9Cm5hbWVzKFVsbGVuX2Jvc19HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9ClVsbGVuX2Jvc19HSU5JIDwtIFVsbGVuX2Jvc19HSU5JICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKFVsbGVuX2Jvc19HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBVbGxlbl9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSW5kdXN0cmkgPSAoKFVsbGVuX2Jvc19HSU5JJEluZHVzdHJpL25hc2pvbmFsdF9ib3N0ZWQkSW5kdXN0cmkgLSBVbGxlbl9ib3NfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKFVsbGVuX2Jvc19HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYm9zdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYCAtIFVsbGVuX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2Jvc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0KVWxsZW5fYm9zX0dJTkkgPC0gVWxsZW5fYm9zX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIFJESV9Qcmltw6ZyID0gMSAvIGFicyhVbGxlbl9ib3NfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYCAvIFVsbGVuX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYm9zdGVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gYWJzKFVsbGVuX2Jvc19HSU5JJEluZHVzdHJpIC8gVWxsZW5fYm9zX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2Jvc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9IZWxzZSA9IDEgLyBhYnMoVWxsZW5fYm9zX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL1VsbGVuX2Jvc19HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9ib3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9ib3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkpICU+JSAKICAKICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpCmBgYAoKYGBge3J9CmthYmxlKAogIFVsbGVuX2Jvc19HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJVbGxlbnN2YW5nOiBHaW5pICYgUkRJIj04KSkKCmthYmxlKAogIFVsbGVuX2Jvc19HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkVpci9FciIgPSAzLCAiRWluL0VuIiA9IDMsICJMUSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiVWxsZW5zdmFuZzoiPTExKSkKYGBgCgojIDMgU3lzc2Vsc2V0dGluZyBpIHVsaWtlIG7DpnJpbmdlciwgZXR0ZXIgYm9zdGVkIChNb2RlbGxlciB1bmRlciBhcmJlaWQpCgpOw6UgaGFyIHZpIHNldHQgcMOlIHV0dmlrbGluZ2VuIGF2IGh2b3IgbWFuZ2Ugc29tIGpvYmJlciBpIGtvbW11bmVuZSBldHRlciBkZSA2IG1lc3QgcmVsZXZhbnRlIG7DpnJpbmdlbmUsIGZyYSAyMDA4IHRpbCAyMDIwLCBpIHJlZ2lvbmVuZSBIYXVnYWxhbmRldCwgU3VubmhvcmRsYW5kIG9nIEhhcmRhbmdlci4gVmkgaGFyIG9nc8OlIHNldHQgcMOlIEdpbmkta29lZmZpc2llbnRlbmUgb2cgUkRJLXZlcmRpZW5lIHRpbCB1dHZhbGd0ZSBrb21tdW5lciBvZyBuw6ZyaW5nZXIsIHNhbXQgcHJvYmxlbXN0aWxsaW5nZW4gdmVkIGRpc3NlIHZlcmRpZW5lIGkgZm9yaG9sZCB0aWwgZGF0YWVuZSB2w6VyZXMgb2cgYWdncmVnZXJpbmdzbml2w6VldCB2aSBoYXIuCgpWaWRlcmUgc2thbCB2aSBuw6Ugc2UgcMOlIHV0dmlrbGluZ2VuIGZvciBodm9yIG1hbmdlIHNvbSBib3IgaSBkZSB1bGlrZSBrb21tdW5lbmUgaSByZWdpb25lbmUsIHNvbSBqb2JiZXIgaW5uZW5mb3IgZGUgNiBtZXN0IHJlbGV2YW50ZSBuw6ZyaW5nZW5lLCBHaW5pLWtvZWZmaXNpZW50ZW5lIG9nIFJESS12ZXJkaWVuZSBmb3IgZGV0dGUuIFZpIGJlZ3lubmVyIG1lZCBIYXVnYWxhbmRldC4KCiMjIEhhdWdhbGFuZGV0CgpgYGB7ciBCb3N0ZWRfSGF1Z2FsYW5kZXRfMX0KaGxkX2JvcyAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IMOFciwgeSA9IGBBbGxlIE7DpnJpbmdlcmApKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiRmlnLiAxNzogSGF1Z2FsYW5kZXQiKSsKICB5bGFiKCJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkKYGBgCgpGaWd1cmVuIHZpc2VyIGF0IGRldCBlciBzdmluZ25pbmdlciBpIGFudGFsbCBhbnNhdHRlIGkgYWxsZSBuw6ZyaW5nZXIgZm9yIHBlcmlvZGVuLCBtZWQgZXQgY2EuIEdqZW5ub21zbml0dCBmb3IgcGVyaW9kZW4gcMOlIDUxLjAwMCBhbnRhbGwgYm9zYXR0ZSBww6UgSGF1Z2FsYW5kZXQgc29tIGVyIHN5c3NlbHNhdHQgaSBhbGxlIG7DpnJpbmdlci4gU3ZpbmduaW5nZW5lIHZhcmllcmVyIGZyYSArLy0gMS41MDAgZnJhIGdqZW5ub21zbml0dGV0IGkgcGVyaW9kZW4sIGRldCBzZXIgbGlrZXZlbCB1dCB0aWwgYXQgc3ZpbmdlbmUgZXIgc3RhYmlsZSBvZyBub3JtYWxlIGV0dGVyc29tIGRldCB2aWwgdsOmcmUgbmF0dXJsaWcgbWVkIGhlbnN5biBww6UgYXQgbnllIGJlZHJpZnRlciBzdGFydGVyIG9wcCBpIHJlZ2lvbmVuLCBiZWRyaWZ0ZXIgc29tIGxlZ2dlciBuZWQgZWxsZXIgYmVkcmlmdGVyIHNvbSByZS1sb2thbGlzZXJlciBzZWcgZXQgYW5uZXQgc3RlZC4KCmBgYHtyIEJvc3RlZF9IYXVnYWxhbmRldF8yfQpzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgYygxMTA2LCAxMTM1LCAxMTQ1LCAxMTQ2LCAxMTQ5LCAxMTUxLCAxMTYwKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBgQWxsZSBOw6ZyaW5nZXJgLCAoYW5nbGU9MCkpKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0ga25hdm4sIGNvbG91ciA9IGtuYXZuKSkgKwogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoc2VxKDIuMCwgMiwgYnkgPSAtMC4xKSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDE4OiBIYXVnYWxhbmRldCIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSBpICBcbiBhbGxlIG7DpnJpbmdlciIpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoYW5nbGU9MCkpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCkZpZ3VyZW4gdmlzZXIgZW4gb3ZlcnNpa3Qgb3ZlciBhbnRhbGwgYW5zYXR0ZSBpIGFsbGUgbsOmcmluZ2VyIGV0dGVyIGtvbW11bmVyIHDDpSBIYXVnYWxhbmRldC4gRmlndXJlbiB2aXNlciBhdCBlbiByaW1lbGlnIHN0YWJpbCBvZyByZWxhdGl2dCBmbGF0IGt1cnZlIGZvciBrb21tdW5lbmUgVXRzaXJhIG9nIEJva24sIHNhbXQgZm9yIFNhdWRhIG9nIFZpbmRhZmpvcmQuIEZvciBUeXN2w6ZyIHZpc2VyIGZpZ3VyZW4gYXQgZGV0IGVyIGxpdHQgbWVyIHN2aW5nbmluZ2VyLCBtZW4gZGUgZXIgbGF2ZSBzZXR0IGkgZm9yaG9sZCB0aWwga29tbXVuZW5lIEthcm3DuHkgb2cgSGF1Z2VzdW5kLiBEZSB0byBzaXN0bmV2bnRlIGtvbW11bmVuZSBlciBkZSBzdMO4cnN0ZSBpIGRlbm5lIGZvcmJpbmRlbHNlbiBhdiBhbnRhbGwgYW5zYXR0ZSBpIGFsbGUgbsOmcmluZ2VyLCBvZyBkZSB2aWwgZGVyZm9yIG9nc8OlIHbDpnJlIG1lciB1dHNhdHQgZm9yIHN2aW5nbmluZ2VyIGJhc2VydCBww6UgYXQgYW50YWxsIGJlZHJpZnRlciBlciBsYW5ndCBow7h5ZXJlLCBvZyBkYSBtZWQgaGVuc3luIHDDpSBhdCBiZWRyaWZ0ZXIgc29tIHN0YXJ0ZXIgb3BwLCBsZWdnZXIgbmVkIGVsbGVyIHNvbSByZS1sb2thbGlzZXJlciBzZWcuIAoKRGV0IHZpIGltaWRsZXJ0aWQgc2VyIGVyIGF0IEhhdWdlc3VuZCBvZyBLYXJtw7h5IGVyIHPDpSBzdG9yZSBhdCBkZXQgcMOldmlya2VyIGh2b3JkYW4gZGUgbWluZHJlIGtvbW11bmVuZSBzb20gQm9rbiwgVHlzdsOmciwgU2F1ZGEgb2cgVXRzaXJhIGJsaXIgZnJlbXN0aWx0LiBWaSB2ZWxnZXIgZGVyZm9yIMOlIHNraWxsZSB1dCBkZSBzdG9yZSBvZyBtaW5kcmUga29tbXVuZW5lIGZvciBzZWcgc29tIHZpc3QgdmlkZXJlLgoKYGBge3IgaGxkX2Jvc19sb25nfQpobGRfYm9zX2xvbmcgPC0gc3lzc2VsX2JvcyAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYEFsbGUgTsOmcmluZ2VyYDpVb3BwZ2l0dCwKICAgIG5hbWVzX3RvID0gIk7DpnJpbmciLAogICAgdmFsdWVzX3RvID0gIkFuc2F0dGUiKQpgYGAKCmBgYHtyIE7DpnJpbmdfVG90YWxfSGF1Z2FsYW5kZXRfM19TdMO4cnN0ZV9Cb3N0ZWR9CmhsZF9ib3NfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiSGF1Z2VzdW5kIiwgIkthcm3DuHkiLCAiVmluZGFmam9yZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSAiQWxsZSBOw6ZyaW5nZXIiKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUsIG9wdGlvbiA9ICJBIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiAxOTogSGF1Z2FsYW5kZXQ6IEhhdWdlc3VuZCwgS2FybcO4eSBvZyBWaW5kYWZqb3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCkRlbm5lIGZpZ3VyZW4gc2FtbWVubGlnbmVyIGFudGFsbCBhbnNhdHRlIGkgYWxsZSBuw6ZyaW5nZXIgZm9yIGtvbW11bmVuZSBIYXVnZXN1bmQsIEthcm3DuHkgb2cgVmluZGFmam9yZC4gRmlndXJlbiB2aXNlciBhdCBpIMOlcmV0IDIwMTAsIGVyIGRldCBsYXZlc3RlIMOlcmV0IGZvciBwZXJpb2RlbiBzYW1sZXQgZm9yIGFsbGUgdHJlIGtvbW11bmVuZS4gVmlkZXJlIHZpc2VyIGRlbiBhdCDDpXJldCAyMDE0LCB2YXIgZGV0IGjDuHllc3RlIMOlcmV0IGZvciBwZXJpb2RlbiBzYW1sZXQgZm9yIGFsbGUgdHJlIGtvbW11bmVuZSwgb2cgbGlrZWRhbiB2aXNlciBmaWd1cmVuIGF0IGZyYSAyMDE0LCBoYXIgYWxsZSBrb21tdW5lbmUgZW4gbmVkZ2FuZyBmcmVtIHRpbCAyMDE1LTIwMTYgZsO4ciBkZSB0YXIgc2VnIG9wcCBpZ2plbiBpIDIwMTguIEFsbGUgdHJlIGtvbW11bmVuZSB2aXNlciBkZXQgc2FtbWUgbcO4bnN0ZXJldC4KCmBgYHtyIE7DpnJpbmdfVG90YWxfSGF1Z2FsYW5kZXRfNF9NaW5zdGVfQm9zdGVkfQpobGRfYm9zX2xvbmcgJT4lIAogIGZpbHRlcihrbmF2biAlaW4lIGMoIkJva24iLCAiU2F1ZGEiLCAiVHlzdsOmciIsICJVdHNpcmEiKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMjA6IEhhdWdhbGFuZGV0OiBCb2tuLCBTYXVkYSBUeXN2w6ZyIG9nIFV0c2lyYSIsIHggPSAiw4VyIiwgeSA9ICJBbnRhbGwgYW5zYXR0ZSIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyhncm91cCA9IE7DpnJpbmcsIGNvbG91ciA9IE7DpnJpbmcpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+IGtuYXZuLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKYGBgCgpEZW5uZSBmaWd1cmVuIHZpc2VyIGFudGFsbCBhbnNhdHRlIGV0dGVyIGJvc3RlZCBpIGFsbGUgbsOmcmluZ2VyIGZvciBrb21tdW5lbmUgQm9rbiwgU2F1ZGEsIFR5c3bDpnIgb2cgVXRzaXJhLiBLb21tdW5lbmUgQm9rbiBvZyBUeXN2w6ZyIGhhciBzaWRlbiAyMDA4LCBoYXR0IGVuIGdyYWR2aXMsIG1lbiBub2UgdXN0YWJpbCDDuGtuaW5nIGkgYW50YWxsIGFuc2F0dGUsIG1lbnMga29tbXVuZW4gU2F1ZGEgb2cgVXRzaXJhIGhhciBoYXR0IGVuIGdyYWR2aXMgbmVkZ2FuZyBpIGFudGFsbCBhbnNhdHRlLgoKRm9yIMOlIGbDpSBlbiBiZWRyZSBvdmVyc2lrdCBvdmVyIHJlZ2lvbmVuIHPDpSB2ZWxnZXIgdmkgw6Ugc2UgcMOlIHV0dmlrbGluZ2VuIHRpbCBuw6ZyaW5nZW5lIGkga29tbXVuZW5lLCBzb20gdmlzdCBww6UgZmlndXJlbmUgdW5kZXIuCgpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGF1Z2VsYW5kZXRfM19TdMO4cnN0ZV9Cb3N0ZWR9CmhsZF9ib3NfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiSGF1Z2VzdW5kIiwgIkthcm3DuHkiLCAiVmluZGFmam9yZCIpKSAlPiUgCiAgZmlsdGVyKE7DpnJpbmcgJWluJSBjKCJJbmR1c3RyaSIsICJIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyIiwgIkZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nIiwgIkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uIiwgIkJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldCIsICJKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2UiKSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDIxOiBIYXVnYWxhbmRldDogSGF1Z2VzdW5kLCBLYXJtw7h5IG9nIFZpbmRhZmpvcmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX0hhdWdlbGFuZGV0XzRfTWluc3RlX0Jvc3RlZH0KaGxkX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJCb2tuIiwgIlNhdWRhIiwgIlR5c3bDpnIiLCAiVXRzaXJhIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMjI6IEhhdWdhbGFuZGV0OiBCb2tuLCBTYXVkYSwgVHlzdsOmciBvZyBVdHNpcmEiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKRmlndXJlbmUgdmlzZXIgYW50YWxsIGFuc2F0dGUgZXR0ZXIgYm9zdGVkLCBmb3JkZWx0IGkgdWxpa2UgbsOmcmluZ2VyIGZvciBrb21tdW5lbmUgcMOlIEhhdWdhbGFuZGV0IGZvciBwZXJpb2RlbiAyMDA4IOKAkyAyMDIwLiBIZWxzZS0gb2cgc29zaWFsdGplbmVzdGVyIGVyIGVuIGF2IGRlIHN0w7hyc3RlIG7DpnJpbmdlbmUgZm9yIGFsbGUga29tbXVuZW5lIG9nIGRlbm5lIGVyIGdyYWR2aXMgw7hrZW5kZSBmb3IgYWxsZSBrb21tdW5lbmUgaSBwZXJpb2Rlbi4gSW5kdXN0cmkgZXIgb2dzw6UgYmxhbnQgZGUgc3TDuHJzdGUgbsOmcmluZ2VuZSBmb3IgYWxsZSBkaXNzZSBrb21tdW5lbmUsIG9nIGRlbm5lIG7DpnJpbmdlbiBlciBncmFkdmlzIGZhbGxlbmRlIGZvciBIYXVnZXN1bmQsIEthcm3DuHkgaGFyIGV0IGVuZGEgc3TDuHJyZSBmYWxsIGZvciBkZW5uZSBuw6ZyaW5nZW4gZm9yIHBlcmlvZGVuLCBkYSBzw6ZybGlnIGkgcGVyaW9kZW4gMjAwOC0yMDEwLiBGb3IgVmluZGFmam9yZCBlciBkZW5uZSBuw6ZyaW5nZW4gZ3JhZHZpcyDDuGtlbmRlIGZyZW0gdGlsIDIwMTUsIGbDuHIgZGVuIGRlcmV0dGVyIGdyYWR2aXMgZmFsbGVyIGlnamVuLgoKRm9yIEhhdWdlc3VuZCBvZyBLYXJtw7h5IHNlciB2aSBhdCBuw6ZyaW5nZW4gam9yZGJydWsgb2cgc2tvZ2JydWsgZXIgc8OmcmxpZyBsYXZlIGkgYW50YWxsIGFuc2F0dGUsIG1lbiBmb3IgVmluZGFmam9yZCBlciBkZW5uZSBuw6ZyaW5nZW4gYmV0eWRlbGlnIGjDuHllcmUgZW5uIEhhdWdlc3VuZCBvZyBLYXJtw7h5LiBGb3IgbsOmcmluZ2VuIGZpbmFuc2llcmluZyBvZyBmb3JzaWtyaW5nIGVyIGRlbm5lIGt1cnZlbiBsYXYgb2cgdGlsbsOmcm1ldCBmbGF0IGkgYWxsZSBrb21tdW5lbmUgZm9yIHBlcmlvZGVuLCBvZyBkZXQgc2FtbWUgZm9yIG7DpnJpbmdlbiBlbGVrdHJpc2l0ZXQsIHZhbm4gb2cgcmVub3Zhc2pvbi4gQnlnZy0gb2cgYW5sZWdnc3Zpcmtzb21oZXQgZXIgb2dzw6UgbGF2IGZvciBIYXVnZXN1bmQgb2cgS2FybcO4eSwgbWVuIHNvbSBqb3JkYnJ1ayBvZyBza29nYnJ1aywgZXIgZGVubmUgbsOmcmluZ2VuIGjDuHllcmUgaSBWaW5kYWZqb3JkIHNhbW1lbmxpZ25ldCBtb3Qga29tbXVuZW5lIEhhdWdlc3VuZCBvZyBLYXJtw7h5IHRhdHQgaSBiZXRyYWt0bmluZyBhdCBWaW5kYWZqb3JkIGhhciBldCBiZXR5ZGVsaWcgbGF2ZXJlIGFudGFsbCBhbnNhdHRlIHRvdGFsdCBlbm4gSGF1Z2VzdW5kIG9nIEthcm3DuHkgaGFyLgoKVmkgc2VyIG9nc8OlIHNhbW1lIHRyZW5kZW5lIGZvciBkZSBzbcOlIGtvbW11bmVuZSBww6UgSGF1Z2FsYW5kZXQuIEhlbHNlLSBvZyBzb3NpYWxlIHRqZW5lc3RlciBoYXIgZXN0dCBlbiBzdGFiaWwgdmVrc3QgaSBCb2tuLCBTYXVkYSwgVHlzdsOmciBvZyB1dHNpcmEsIG1lbnMgaW5kdXN0cmllbiBoYXIsIG1lZCB1bm50YWsgYXYgYm9rbiwgc2V0dCBlbiByZWR1a3Nqb24gaSBwZXJpb2RlbiAyMDA4IC0gMjAyMC4gVXRzaXJhIHNraWxsZXIgc2VnIG9nIHV0IG1lZCDDpSBoYXR0IGVuIHN2YWsgdmVrc3QgaSBqb3JkYnJ1aywgc2tvZ2JydWsgb2cgZmlza2UgaSBkZW5uZSBwZXJpb2Rlbi4KCiMjIFN1bm5ob3JkbGFuZAoKVmlkZXJlIHZpbCB2aSBuw6Ugc2UgcMOlIHV0dmlrbGluZ2VuIGZvciByZWdpb24gU3VubmhvcmRsYW5kLgoKYGBge3IgQm9zdGVkX1N1bm5ob3JkbGFuZF8xfQpzdW5fYm9zICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gw4VyLCB5ID0gYEFsbGUgTsOmcmluZ2VyYCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJGaWcuIDIzOiBTdW5uaG9yZGFsYW5kIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIGkgIFxuIGFsbGUgbsOmcmluZ2VyIikgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChhbmdsZT0wKSkrIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkKYGBgCgpEZW5uZSBmaWd1cmVuIHZpc2VyIHV0dmlrbGluZ2VuIGF2IGFudGFsbCBzeXNzZWxzYXR0ZSBpIGFsbGUgbsOmcmluZ2VyIGV0dGVyIGJvc3RlZCBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQgZnJhIDIwMDggdGlsIDIwMjAuIFZpIGthbiBzZSB1dGZyYSBncmFmZW4gYXQgcmVnaW9uZW4gaGFkZGUgZW4ga3JhZnRpZyB2ZWtzdCAyMDEwIC0gMjAxNCwgZsO4ciBkZW4gZmFsdCBrcmFmdGlnIGkgMjAxNCAtIDIwMTYsIGbDuHIgcmVnaW9uZW4gaWdqZW4gaGFyIHNldHQgZW4ga3JhZnRpZyB2ZWtzdCAyMDE2IC0gMjAxOS4gVXQgZnJhIGdyYWZlbiBrYW4gZGV0IHNlIHV0IHRpbCBhdCByZWdpb25lbiBpZ2plbiBzdMOlciBvdmVuZm9yIGVuIG55IHJlZHVrc2pvbiBmcmEgMjAxOSBhdi4KClZpIMO4bnNrZXIgw6Ugc2UgdmlkZXJlIHDDpSB1dHZpa2xpbmdlbiBww6Uga29tbXVuYWx0IG5pdsOlLCBzb20gdmlzdCBpIGZpZ3VyIDI0LgoKYGBge3IgQm9zdGVkX1N1bm5ob3JkbGFuZF8yfQpzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgYyg0NjExLCA0NjEyLCA0NjEzLCA0NjE0LCA0NjE1LCA0NjE2LCA0NjE3KSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKwogICBsYWJzKHRpdGxlID0gIkZpZy4gMjQ6IFN1bm5ob3JkbGFuZCIsIHggPSAiw4VyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKClZpIHNlciB1dCBmcmEgZ3JhZmVuIGhlciBhdCBkZXQgZXIgaSBob3ZlZHNhayBTdG9yZCwgS3Zpbm5oZXJhZCBvZyBCw7htbG8gc29tIGhhciBzZXR0IGRlbiBzdMO4cnN0ZSBzdmluZ25pbmdlbmUgaSBhbnRhbGwgc3lzc2Vsc2F0dGUgZXR0ZXIgYm9zdGVkLiBNZW4gdmkga2FuIG9nc8OlIGtsYXJ0IHNlIGF0IGRpc3NlIDMga29tbXVuZW5lIGFsbGUgaGFkZGUgZXQgZmFsbCBpIDIwMTQsIHNvbSBzYW1zdmFyZXIgbWVkIGZpZ3VyIDIzLiBHcmFmZW4gZXIgaW1pZGxlcnRpZGlnIGlnamVuIGlra2UgdHlkZWxpZyBub2sgcMOlIGdydW5uIGF2IGRlIHN0b3JlIGtvbW11bmVuZSwgb2cgdmkgZnJlbXN0aWxsZXIgZGVybWVkIGdyYWZlbmUgcMOlIGtvbW11bmFsdCBuaXbDpSBoZXIgb2cgZm9yIMOlIHR5ZGVsaWdqZXJlIHV0dmlrbGluZ2VuIHDDpSBrb21tdW5hbHQgbml2w6UuCgpgYGB7ciBzdW5fYm9zX2xvbmd9CnN1bl9ib3NfbG9uZyA8LSBzeXNzZWxfYm9zICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBgQWxsZSBOw6ZyaW5nZXJgOlVvcHBnaXR0LAogICAgbmFtZXNfdG8gPSAiTsOmcmluZyIsCiAgICB2YWx1ZXNfdG8gPSAiQW5zYXR0ZSIpCmBgYAoKYGBge3IgTsOmcmluZ19Ub3RhbF9TdW5uaG9yZGxhbmRfM19TdMO4cnN0ZV9Cb3N0ZWR9CnN1bl9ib3NfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQsO4bWxvIiwgIkt2aW5uaGVyYWQiLCAiU3RvcmQiKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMjU6IFN1bm5ob3JkbGFuZDogQsO4bWxvLCBLdmlubmhlcmFkIG9nIFN0b3JkIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKCmBgYHtyIE7DpnJpbmdfVG90YWxfU3VubmhvcmRsYW5kXzRfTWluc3RlX0Jvc3RlZH0Kc3VuX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJFdG5lIiwgIkZpdGphciIsICJTdmVpbyIsICJUeXNuZXMiKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMjY6IFN1bm5ob3JkbGFuZDogRXRuZSwgRml0aGFyLCBTdmVpbyBvZyBUeXNuZXMiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKRmlndXIgMjUgb2cgMjYgdmlzZXIgaGVyIHV0dmlrbGluZ2VuIGkgc3lzc2Vsc2F0dGUgZXR0ZXIgYm9zdGVkIGkgYWxsZSBuw6ZyaW5nZXIgcMOlIGtvbW11bmFsdCBuaXbDpSwgbWVuIG7DpSBlciBodmVyIGtvbW11bmUgc2tpbHQgZnJhIGh2ZXJhbmRyZSBvZyB2aSBmw6VyIGV0IGhlbHQgYW5uZXQgYmlsZGUuIFZpIHNlciBuw6UgcmVkdWtzam9uZW4gaSBkZSB0cmUgc3RvcmUga29tbXVuZW5lIFN0b3JkLCBLdmlubmhlcmFkIG9nIELDuG1sbyBteWUgbWVyIHR5ZGVsaWcgb2cgaHZvciBkcmFzdGlzayBkZW5uZSByZWR1a3Nqb25lbiBoYXIgdsOmcnQuIFZpIHNlciBvZ3PDpSBuw6UgYXQgYsOlZGUgRXRuZSBvZyBUeXNuZXMgb2dzw6UgaGFyIGhhdHQgZW4gcGVyaW9kZSBtZWQga3JhZnRpZyByZWR1a3Nqb24sIG1lZCBFdG5lIDIwMTQgLSAyMDIwIG9nIFR5c25lcyAyMDA4IC0gMjAxMi4gVHlzbmVzIGhhciBzZXR0IGVuIHN2YWsgdmVrc3QgZnJhIDIwMTIsIG1lbnMgZml0amFyIHPDpWcgc3RlcmsgdmVrc3QgMjAwOSAtIDIwMTQgb2cgaGFyIGV0dGVyIDIwMTQgc2V0dCBlbiBzdmFrIHJlZHVrc2pvbi4KClZpIGVyIGZvcnRzYXR0IGlra2UgZm9ybsO4eWQsIGZvciB2aSDDuG5za2VyIMOlIHNlIHDDpSB1dHZpa2xpbmdlbiB0aWwgbm9lbiB1dHZhbGd0ZSBuw6ZyaW5nZXIgaSBrb21tdW5lbmUsIG9nIHNlciBkZXJtZWQgdmlkZXJlIHDDpSBmaWd1ciAyNyBvZyAyOC4KCmBgYHtyIE7DpnJpbmdzZm9yZGVsaW5nX29nX1V0dmlrbGluZ19TdW5uaG9yZGxhbmRfM19TdMO4cnN0ZV9Cb3N0ZWR9CnN1bl9ib3NfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiQsO4bWxvIiwgIlN0b3JkIiwgIkt2aW5uaGVyYWQiKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiAyNzogU3VubmhvcmRsYW5kOiBCw7htbG8sIEt2aW5uaGVyYWQgb2cgU3RvcmQiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAzKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKYGBge3IgTsOmcmluZ3Nmb3JkZWxpbmdfb2dfVXR2aWtsaW5nX1N1bm5ob3JkbGFuZF80X01pbnN0ZV9Cb3N0ZWR9CnN1bl9ib3NfbG9uZyAlPiUgCiAgZmlsdGVyKGtuYXZuICVpbiUgYygiRXRuZSIsICJTdmVpbyIsICJGaXRqYXIiLCAiVHlzbmVzIikpICU+JSAKICBmaWx0ZXIoTsOmcmluZyAlaW4lIGMoIkluZHVzdHJpIiwgIkhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXIiLCAiRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmciLCAiRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24iLCAiQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0IiwgIkpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZSIpKSAlPiUgCiAgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeCA9IGFzLkRhdGUocGFzdGUwKGFhciwgIi0wMS0wMSIpKSwgeSA9IEFuc2F0dGUpKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMjg6IFN1bm5ob3JkbGFuZDogRXRuZSwgRml0amFyLCBTdmVpbyBvZyBUeXNuZXMiLCB4ID0gIsOFciIsIHkgPSAiQW50YWxsIGFuc2F0dGUiKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoZ3JvdXAgPSBOw6ZyaW5nLCBjb2xvdXIgPSBOw6ZyaW5nKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gfiBrbmF2biwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCmBgYAoKRGlzc2UgZmlndXJlbmUsIDI3IG9nIDI4LCB2aXNlciB1dHZpa2xpbmdlbiBhdiBzeXNzZWxzYXR0ZSBldHRlciBib3N0ZWQsIHDDpSBrb21tdW5hbHQgbml2w6UgaSBTdW5uaG9yZGxhbmRzcmVnaW9uZW4gMjAwOCAtIDIwMjAuCgpWaSBzZXIgbsOlIGVuIHRyZW5kIGZvciBTdG9yZCwgQsO4bWxvIG9nIEt2aW5uaGVyYWQuIEFsbGUgZGlzc2UgdHJlIGtvbW11bmVuZSBoYWRkZSBldCBrcmFmdGlnIGZhbGwgaSAyMDE0LiBLdmlubmhlcmFkIGhhZGRlIGFsbGVyZWRlIGVuIGpldm4gcmVkdWtzam9uIGkgaW5kdXN0cmkgZnJlbSB0aWwgMjAxNCwgbWVuIGhhZGRlIGxpa2V2ZWxsIGV0IGtyYWZ0aWcgZmFsbCBoZXIsIHNhbW1lbiBtZWQgU3RvcmQgb2cgQsO4bWxvLiBSZWR1a3Nqb25lbiBpIGluZHVzdHJpIGZvciBLdmlubmhlcmFkIGVyIG1lc3Qgc2FubnN5bmVsaWcgc3RlbmdpbmcgYXYgIkItaGFsbGVuIiBww6UgU8O4ci1Ob3JnZSBBbHVtaW5pdW0gQVMgaSAyMDA4IGVuIGF2IGZha3RvcmVuZS4KClZpIHPDpWcgYWtrdXJhdHQgc2FtbWUgZmFsbGV0IG7DpXIgdmkgc8OlZyBww6Ugc3lzc2Vsc2V0dGluZyBldHRlciBhcmJlaWRzc3RlZCB0aWRsZWdlcmUgaSByYXBwb3J0ZW4uIERldHRlIGtvbW1lciBtZXN0IHNhbm5zeW5lbGlnIGF2IG9samUta25la2tldCBpIDIwMTQuIEFrZXIgU29sdXRpb25zLCBzb20gZGV0IGhldGVyIGkgZGFnLCBlciBibGFudCBTdW5uaG9yZGxhbmRzIHN0w7hyc3RlIGFyYmVpZHNwbGFzc2VyLCBvZyBkZXQgZXIgZmxlcmUgc29tIHBlbmRsZXIgZnJhIGLDpWRlIEt2aW5uaGVyYWQgb2cgQsO4bWxvIHNvbSBqb2JiZXIgcMOlIEFrZXIgU29sdXRpb25zLiBEZXQgZXIgZGVybWVkIG5hdHVybGlnIGF0IGTDpXJsaWdlIHRpZGVyIGkgb2xqZS1pbmR1c3RyaWVuIHZpbCBww6V2aXJrZSBBa2VyIHNvbSBpZ2plbiB2aWwgcMOldmlya2Uga29tbXVuZW5lIHNvbSBoYXIgc3lzc2Vsc2V0dGUgaSBkZW5uZSBuw6ZyaW5nYS4gVmkgc2VyIGVuZGEgZXQgZmFsbCBpIEt2aW5uaGVyYWQgaW5uZW4gaW5kdXN0cmkgaSAyMDE2LCBvZyBkZXR0ZSBrb21tZXIgbWVzdCBzYW5uc3luZWxpZyBhdiBhdCBFaWRlIE1hcmluZSBTZXJ2aWNlIHDDpSBIYWxzbsO4eSBibGVpIHNsw6V0dCBrb25rdXJzIGRldHRlIMOlcmV0LgoKQWxsZSBrb21tdW5lbmUgaSByZWdpb24gU3VubmhvcmRsYW5kIGhhciBvZ3PDpSBzZXR0IGVuIHZla3N0IGlubmVuIGhlbHNlLSBvZyBzb3NpYWxldGplbmVzdGVyIGkgcGVyaW9kZW4gMjAwOCAtIDIwMjAuIEt2aW5uaGVyYWQsIELDuG1sbywgU3RvcmQsIEZpdGphciBvZyBUeXNuZXMgaGFyIHNldHQgZW4gdmVrc3QgaW5uZW4gam9yZGJydWssIHNrb2dicnVrIG9nIGZpc2tlLiBNZXN0IHNhbm5zeW5lbGlnIGVyIGZpc2tlIGVuIHN0b3IgZGVsIGF2IHZla3N0ZW4gZGEgQWxzYWtlciBGam9yZGJydWsgaGFyIGVrc3BhbmRlcnQgaSBkaXNzZSBrb21tdW5lbmUgaSBkZW5uZSBwZXJpb2Rlbi4gQnlnZ2UtIG9nIEFubmxlZ2dzdmlya3NvbWhldCBoYXIgb2dzw6UgaGF0dCBlbiBsaXRlbiB2ZWtzdCBpIGZsZXJlIGtvbW11bmVyLCBtZW5zIGZpbmFucyByZWxhdGVydCBha3Rpdml0ZXQgaGFyIHNldHQgZW4gamV2biByZWR1a3Nqb24gaSBoZWxlIHJlZ2lvbmVuLgoKIyMgSGFyZGFuZ2VyCgpTaXN0ZSByZWdpb25lbiB2aSDDuG5za2VyIMOlIHNlIHDDpSBlciBIYXJkYW5nZXIsIG1lciBzcGVzaWZpa3QgT2RkYSBmcmVtIHRpbCAyMDE5IG9nIFVsbGVuc3ZhbmcgZnJlbSB0aWwgMjAyMC4gVmkgaGFyIGlra2UgdGF0dCBtZWQgSm9uZGFsIGkgSGFyZGFuZ2VyIGZyZW0gdGlsIDIwMTkuIElnamVuIHPDpSBzZXIgdmkgbsOlIHDDpSBzeXNzZWxzZXR0aW5nIGV0dGVyIGJvc3RlZC4KClZpIHNlciBmw7hyc3QgcMOlIGhlbGUgcmVnaW9uZW4gc2FtbGV0LCBqZi4gZmlndXIgMjkuCgpgYGB7ciBCb3N0ZWRfSGFyZGFuZ2VyXzF9Cmhhcl9ib3MgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSDDhXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMjk6IEhhcmRhbmdlciIsIHk9ICJBbGxlIE7DpnJpbmdlciIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDIwLCBieSA9IDEpKQpgYGAKCkRlbm5lIGZpZ3VyZW4gdmlzZXIgdXR2aWtsaW5nZW4gaSBzeXNzZWxzZXR0aW5nIGV0dGVyIGJvc3RlZCwgaSBoZWxlIHJlZ2lvbmVuLCBvZyBoZXIgZXIgZGV0IG5vZSBzb20gYsO4ciBiZW1lcmtlcy4gRsO4cnN0IG9nIGZyZW1zdCBzaWRlbiBKb25kYWwgaWtrZSB2YXIgZW4gZGVsIGF2IGRhdGFlbmUgZnJlbSB0aWwgMjAxOSwgbWVuIGJsaXIgdGF0dCBtZWQgaSBVbGxlbnN2YW5nIGkgMjAyMCBzw6UgdmlsIHZpIHNlIGVuIHVuYXR1cmxpZyB2ZWtzdCBpIGRlbm5lIGZpZ3VyZW4gaSAyMDIwLiBEZXR0ZSBlciBlbiBzdmFraGV0IGkgbW9kZWxsZW4gb2cgZGF0YWVuZSB2w6VyZXMuIERldCBhbmRyZSBlciBhdCB2aSBrYW4gc2UgZW4ga2xhciBuZWdhdGl2IHV0dmlrbGluZyBpIEhhcmRhbmdlciBmcmVtIHRpbCAyMDE5LgoKRm9yIMOlIGlsbHVzdHJlcmUgdXR2aWtsaW5nZW4gYmVkcmUsIHPDpSBza2lsbGVyIHZpIG1lbGxvbSBPZGRhIG9nIFVsbGVuc3ZhbmcgdmVkIG5lc3RlIGZpZ3VyLgoKYGBge3IgQm9zdGVkX0hhcmRhbmdlcl8yfQpzeXNzZWxfYm9zICU+JSAKICBmaWx0ZXIoa25yICVpbiUgYyg0NjE4LCAxMjI4KSkgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhYXIsIHkgPSBgQWxsZSBOw6ZyaW5nZXJgKSkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGtuYXZuLCBjb2xvdXIgPSBrbmF2bikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoJyMxMTExMTEnLCcjMDU0OTg3JykpICsKICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKHNlcSgyLjAsIDIsIGJ5ID0gLTAuMSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAyMCwgYnkgPSAxKSkgKwogICBsYWJzKHRpdGxlID0gIkZpZy4gMzA6IEhhcmRhbmdlciIsIHggPSAiw4VyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKClZpIHNlciBuw6UgcMOlIGRlbm5lIGZpZ3VyZW4gYXQgYsOlZGUgT2RkYSBvZyBVbGxlbnN2YW5nIGhhciBoYXR0IGVuIG5lZ2F0aXYgdXR2aWtsaW5nIGZyZW0gdGlsIG9nIG1lZCAyMDE5LiBWaSBzZXIgb2dzw6UgcHJvYmxlbXN0aWxsaW5nZW4gbWVkIMOlIGlra2UgdGEgbWVkIEpvbmRhbCB1bmRlciBIYXJkYW5nZXIga29tbWVyIHR5ZGVsaWdlcmUgZnJlbSBuw6UgbWVkIGVuIGVrc3RyZW0gdmVrc3QgZXR0ZXIgc2FtbWVuc2zDpWluZ2VuIG1lbGxvbSBPZGRhLCBKb25kYWwgb2cgVWxsZW5zdmFuZyBpIDIwMjAuIEbDuHIgdmkgdmVsZ2VyIMOlIHNlIHDDpSB1dHZhbGd0ZSBuw6ZyaW5nZXIgaSBodmVyIGtvbW11bmUsIHZlbGdlciB2aSBmw7hyc3Qgw6UgZGVsZSBrb21tdW5lbmUgb3BwIGh2ZXIgZm9yIHNlZywgc2xpayBhdCB2aSBrYW4gc2UgdXR2aWtsaW5nZW4gbWVyIGRyYXN0aXNrLgoKYGBge3IgaGFyX2Jvc19sb25nfQpoYXJfYm9zX2xvbmcgPC0gc3lzc2VsX2JvcyAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYEFsbGUgTsOmcmluZ2VyYDpVb3BwZ2l0dCwKICAgIG5hbWVzX3RvID0gIk7DpnJpbmciLAogICAgdmFsdWVzX3RvID0gIkFuc2F0dGUiKQpgYGAKCmBgYHtyIE7DpnJpbmdfVG90YWxfSGFyZGFuZ2VyX0Jvc3RlZH0KaGFyX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJPZGRhIiwgIlVsbGVuc3ZhbmciKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgIkFsbGUgTsOmcmluZ2VyIikgJT4lIAogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBhcy5EYXRlKHBhc3RlMChhYXIsICItMDEtMDEiKSksIHkgPSBBbnNhdHRlKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoZGlzY3JldGUgPSBUUlVFLCBvcHRpb24gPSAiQSIpICsKICBsYWJzKHRpdGxlID0gIkZpZy4gMzE6IEhhcmRhbmdlcjogT2RkYSBvZyBVbGxlbnN2YW5nIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKClZpIHNlciBoZXIgdHlkZWxpZyB1dHZpa2xpbmdlbiB0aWwgc3Blc3NpZWx0IE9kZGEsIHNvbSBiZXJyZSBzdHVwZXIgbmVkLCB1dGVuIHRlZ24gdGlsIMOlIHNudSBtZWQgZGV0IGbDuHJzdGUuIEZvciDDpSBzZSB1dHZpa2xpbmdlbiB0eWRsaWdlcmUgc8OlIGRlbGVyIHZpIGlnamVuIG9wcCBpIG5vZW4gdXR2YWxndGUgbsOmcmluZ2VyIGkgaHZlciBrb21tdW5lLCBqZi4gZmlndXIgMzIuCgpgYGB7ciBOw6ZyaW5nc2ZvcmRlbGluZ19vZ19VdHZpa2xpbmdfSGFyZGFuZ2VyX0Jvc3RlZH0KaGFyX2Jvc19sb25nICU+JSAKICBmaWx0ZXIoa25hdm4gJWluJSBjKCJPZGRhIiwgIlVsbGVuc3ZhbmciKSkgJT4lIAogIGZpbHRlcihOw6ZyaW5nICVpbiUgYygiSW5kdXN0cmkiLCAiSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlciIsICJGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZyIsICJFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbiIsICJCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQiLCAiSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlIikpICU+JSAKICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gYXMuRGF0ZShwYXN0ZTAoYWFyLCAiLTAxLTAxIikpLCB5ID0gQW5zYXR0ZSkpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSAiRmlnLiAzMjogSGFyZGFuZ2VyOiBPZGRhLCBVbGxlbnN2YW5nIiwgeCA9ICLDhXIiLCB5ID0gIkFudGFsbCBhbnNhdHRlIikgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKGdyb3VwID0gTsOmcmluZywgY29sb3VyID0gTsOmcmluZykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH4ga25hdm4sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKQpgYGAKClZpIHNlciBww6UgZGVubmUgZmlndXJlbiB1dHZpa2xpbmdlbiBhdiA2IHVsaWtlIG7DpnJpbmdhciwgbWVkIGhlbnN5biBww6Ugc3lzc3NlbHNldHRpbmcgZXR0ZXIgYm9zdGVkLCBpIEhhcmRhbmdlciBpIGRlbm5lIHBlcmlvZGVuLiBWaSBzZXIgc2FtbWUgdHJlbmRlciBoZXIgaSBIYXJkYW5nZXIgc29tIHZpIGdqb3JlIGZvciBiw6VkZSBTdW5uaG9yZGxhbmQgb2cgSGF1Z2FsYW5kZXQ6IHJlZHVrc2pvbiBpIGluZHVzdHJpIG9nIHByaW3DpnJuw6ZyaW5nYW5lLCBtZW5zIHZpIHNlciBlbiB2ZWtzdCBpIGhlbHNldGplbmVzdGVyLiBEZXQgc29tIGVyIGxpdHQgaW50ZXJlc3NhbnQgw6UgYmVtZXJrZSBlciBhdCBPZGRhIHPDpWcgZW4gdmVrc3QgaSBpbmR1c3RyaSBmcmEgMjAxNiB0aWwgMjAxOSwgbWVuIGdydW5uYSBzYW1tZW5zbMOlaW5nZW4gZXIgZGV0IHZhbnNrZWxpZyDDpSBzaSBub2Ugb20gdXR2aWtsaW5nZW4gZm9yIE9kZGEgc3Blc2lmaWt0IGkgMjAyMC4gSWdqZW4gc8OlIHNlciB2aSBvZ3PDpSBzYW1tZSBla3N0cmVtZSB2ZWtzdCBpIFVsbGVuc3ZhbmcgaSAyMDIwIHNvbSBrb21tZXIgYXYgc2FtbWVuc2zDpWluZ2VuLgoKT2RkYSBlciBramVudCBsb2thbHQgZm9yIHNpbiBhbGRyZW5kZSBiZWZvbGtuaW5nLCBzb20gbWVzdCBzYW5uc3luZWxpZyBlciBlbiB2aWt0aWcgZmFrdG9yIGZvciBodm9yZm9yIE9kZGEgaGFyIHNldHQgc8OlIGtyYWZ0aWcgcmVkdWtzam9uIGkgc3lzc2Vsc2V0dGluZyBldHRlciBib3N0ZWQsIHNhbXRpZGlnIHNvbSBrb21tdW5lbiBoYXIgc2V0dCBlbiB2ZWtzdCBpIGhlbHNldGplbmVzdGVyLgoKIyAzLjEgTG9rYWxpc2VyaW5nc2t2b3RpZW50ZXIgKERldHRlIGVyID5FR0VOVExJRzwgT3BwZ8OldmUgMiBzb20gYmxpciBnam9ydCBoZXIuIERlbm5lIG9nIEdpbmkvUkRJIGZvciBvcHBnw6V2ZSAyIGLDuHIgYmxpIGJ5dHRhc3Qgb20pCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCm5hc2pvbmFsdF9hcmJlaWRzc3RlZCA8LSByZWFkX2V4Y2VsKCJEYXRhL25hc2pvbmFsdF9hcmJlaWRzc3RlZC54bHN4IikKYGBgCgojIyBMb2thbGlzZXJpbmdza3ZvdGllbnRlciBmb3IgcmVnaW9uZW5lIHNhbWxldAoKTsOlIGhhciB2aSBpbGx1c3RlcnQgb2cgc2V0dCBww6UgZ3JhZmVuZSBmb3IgdXR2aWtsaW5nZW4gaSBkZSB0cmUgcmVnaW9uZW5lLCBtZWQgaGVuc3luIHDDpSBzeXNzZWxzZXR0aW5nIGV0dGVyIGFyYmVpZHNzdGVkLiBWaWRlcmUgaSByYXBwb3J0ZW4gc2thbCB2aSBuw6Ugc2UgcMOlIEdpbmkta29lZmZpc2llbnRlbmUgb2cgZGVuIHJlZ2lvbmVsbGUgZGl2ZXJzaWZpc2VyaW5ncyBpbmRla3NlbiAoUkRJKSBmb3Igw6UgdnVyZGVyZSBodm9yIHNwcmVkdCBlbGxlciBrb25zZW50cmVydCwgc2FtdCBzcGVzaWFsaXNlcnQgdXR2bGFndCBuw6ZyaW5nZXIgZXIgaSB1dHZhbGd0ZSBrb21tdW5lciBpIHJlZ2lvbmVuZS4KCkVuIGdlbmVyZWxsIHJlZ2VsIGZvciBsb2thbGt2b3RpZW50LXZlcmRpZXIgKExRLXZlcmRpZXIpIGVyIGF0IHZpc3N0IHZlcmRpZW4gZXIgb3ZlciAxIHPDpSBrYW4gZGV0IHR5ZGUgcMOlIGF0IGRldCBoYXIgb3Bwc3TDpXR0IGtseW5nZXIgaW5uZW5mb3IgbsOmcmluZ2VuLiBFbiBhbm5lbiByZWdlbCBlciBhdCB2ZXJkaWVyIHVuZGVyIDEgaW5uZW5mb3IgbsOmcmluZ2VyIHNvbSBkcml2ZXIgbWVkIHByb2R1a3Nqb24gb2cgZWtzcG9ydCBzw6UgZXIgZGV0IG9mdGVzdCBlbiAqbG9rYWwgbsOmcmluZyouIFZpc3N0IHZlcmRpZW4gZXIgb3ZlciAxIHPDpSBrYW4gZGV0IHbDpnJlIHRlZ24gdGlsIGF0IGRldCBlciAqZW4gYmFzaXNuw6ZyaW5nKi4KCkRpc3NlIHRvIGFyZ3VtZW50ZW5lIGZvciBMUS12ZXJkaWVyIHZpbCB2aSB0YSBtZWQgb3NzIHZpZGVyZSBuw6VyIHZpIHNlciBuZXJtZXJlIHDDpSByZWdpb25lbmUgaSBzaW4gaGVsaGV0IG9nIHV0dmFsZ3RlIG7DpnJpbmdlciwgc2FtdCB1dHZhbGd0ZSBrb21tdW5lciBvZyBuw6ZyaW5nZXIgaSBkZW0uCgpSREkgZXIgZXQgbcOlbCBmb3IgaHZvcnZpZHQgbsOmcmluZ3NzdHJ1a3R1cmVuIGVyIGRpdmVyc2lmaXNlcnQgb2cgbWFuZ2ZvbGRpZy4gSMO4eSBSREkga2FyYWt0ZXJpc2VydCB2ZWQgbWVyIHNwZXNpYWxpc2VydCwgb2cgbW90c2F0dC4KCiMjIyBIYXVnYWxhbmRldCAyMDA4LTIwMjAKCkbDuHJzdGUgcmVnaW9uZW4gdmkgc2VyIHDDpSBlciBIYXVnYWxhbmRldC4KCmBgYHtyIGhsZF9hcmJfRWlyX0VyfQpobGRfYXJiX0xRIDwtIGhsZF9hcmIgJT4lIAogIG11dGF0ZShFaXJfRXJfSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cgPSBgQnlnZ2UtIG9nIEFubmxlZ2dzdmlya3NvbWhldGAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0ZpbmFucyA9IGBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZ2AvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9Kb3JkYnJ1ayA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKCiAgICAgICAgIEVpbl9Fbl9JbmR1c3RyaSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKCiAgICAgICAgIEVpbl9Fbl9FbF9WYW5uX1Jlbm8gPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9CeWdnX29nX0FubGVnZyA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0YC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9GaW5hbnMgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9VbmRlcnZpc25pbmcgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkVW5kZXJ2aXNuaW5nL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICAKICAgICAgICAgRWluX0VuX0hlbHNlID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfSm9yZGJydWsvRWluX0VuX0pvcmRicnVrLAogICAgICAgICBMUV9JbmR1c3RyaSA9IEVpcl9Fcl9JbmR1c3RyaS9FaW5fRW5fSW5kdXN0cmksCiAgICAgICAgIExRX0VsX1Zhbm5fUmVubyA9IEVpcl9Fcl9FbF9WYW5uX1Jlbm8vRWluX0VuX0VsX1Zhbm5fUmVubywKICAgICAgICAgTFFfQnlnZ19vZ19BbmxlZ2cgPSBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cvRWluX0VuX0J5Z2dfb2dfQW5sZWdnLAogICAgICAgICBMUV9GaW5hbnMgPSBFaXJfRXJfRmluYW5zL0Vpbl9Fbl9GaW5hbnMsCiAgICAgICAgIExRX1VuZGVydmlzbmluZyA9IEVpcl9Fcl9VbmRlcnZpc25pbmcvRWluX0VuX1VuZGVydmlzbmluZywKICAgICAgICAgTFFfSGVsc2UgPSBFaXJfRXJfSGVsc2UvRWluX0VuX0hlbHNlCikgJT4lIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9FbF9WYW5uX1Jlbm8sIExRX0J5Z2dfb2dfQW5sZWdnLCBMUV9GaW5hbnMsIExRX1VuZGVydmlzbmluZywgTFFfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZShobGRfYXJiX0xRLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSm9yZGJydWsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFubiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCeWdnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbmFucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmRlcnYuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiTG9rYWxrdm90aWVudCwgcmVnaW9uOiBIYXVnYWxhbmRldCI9OSkpCmBgYAoKSSBkZW5uZSB0YWJlbGxlbiBzw6Ugc2VyIHZpIGFsbGUgbG9rYWxrdm90aWVudHZlcmRpZW5lKExRKSBmb3IgNyB1dHZhbGd0ZSBuw6ZyaW5nZXIgcMOlIEhhdWdhbGFuZGV0LiBVdCBhdiBkZSA3IHV0dmFsZ3RlIG7DpnJpbmdlbmUsIHPDpSB0eWRlciBkZXQgcMOlIGF0IGRldCBlciBrbHluZ2VyIGkgNSBhdiBkZW0sIHNvbSBlciAqSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlKiwgKkluZHVzdHJpKiwgKkVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uKiwgKkJ5Z2dlLSBvZyBBbm5sZWdnc3Zpcmtzb21oZXQqLCBvZyAqSGVsc2V0amVuZXN0ZXIqLiAgVXQgZnJhIHRhYmVsbGVuIHPDpSB0eWRlciBkZXQgcMOlIGF0IHJlZ2lvbmVuIGlubmVob2xkZXIgYmFzaXNuw6ZyaW5nZXIgaW5uZW4gSW5kdXN0cmkgb2cgRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24sIGRhIGRpc3NlIHZlcmRpZW5lIGVyIGxhbmd0IG92ZXIgMSBvZyBlciB0eXBpc2tlIG7DpnJpbmdlciBlbiBrYW4gZm9ydmVudGUgw6UgdsOmcmUgYmFzaXNuw6ZyaW5nZXIuCgpWaSBzZXIgYXQgaW5kdXN0cmkgaGFyIGhhdHQgc3TDuHJzdCB1dHZpa2xpbmcgZnJhIExRIHDDpSAxLjU1IHRpbCAxLjc1LCBtZW5zIHJlc3RlbiBhdiBuw6ZyaW5nZW5lIGhhciB2w6ZydCBnYW5za2Ugc3RhYmlsZSwgbWVkIHVudGFrdCBhdiBmaW5hbnMgc29tIGhhciBibGl0dCBuZXN0ZW4gaGFsdmVydCBmcmEgMC40NzggdGlsIDAuMjg2LgoKYGBge3J9CmhsZF9hcmJfR0lOSSA8LSBobGRfYXJiICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKGhsZF9hcmIkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC0gaGxkX2FyYiRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9JbmR1c3RyaSA9ICgoaGxkX2FyYiRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBobGRfYXJiJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0hlbHNlID0gKChobGRfYXJiJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gaGxkX2FyYiRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0KaGxkX2FyYl9HSU5JIDwtIGhsZF9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKGhsZF9hcmIkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBobGRfYXJiJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhobGRfYXJiJEluZHVzdHJpIC8gaGxkX2FyYiRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9IZWxzZSA9IDEgLyBhYnMoaGxkX2FyYiRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvaGxkX2FyYiRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSkgJT4lIAogIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoaGxkX2FyYl9HSU5JLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJIYXVnYWxhbmRldCI9OCkpCmBgYAoKSGVyIHNlciB2aSBmbGVyZSBmYWt0b3Jlci4KCkRldCBmw7hyc3RlIG9nIHZpa3RpZ2VzdGUgdmkgc2VyIG1lZCBlbiBnYW5nIGVyIEdJTkkta29lZmZpc2llbnRlbmUuIFZpIGhhciBlbiBzdG9yIHN2YWtoZXQgaSBkaXNzZSBiZXJlZ25pbmdlLCBzb20gc3RhbW1lciBmcmEgYWdncmVnZXJpbmdzbml2w6VldCB2w6VydC4gSSB2w6VyZSBkYXRhIGVyIHByaW3DpnIsIGluZHVzdHJpIG9nIGhlbHNldGplbmVzdGVyIGVuICJmZWxsZXMgYmVuZXZuZWxzZSIuIERldCB2aWwgc2kgYXQgbsOlciB2aSBoZW50ZXQgZGF0YSBmcmEgU1NCIHPDpSBza2lsdGUgaWtrZSBTU0IgbsOmcmluZ2VuZSBpbm5lbiBodmVyIGJlbWVya2Vsc2UsIGkgdGFiZWxsZW4gdmkgYnJ1a3RlIHNvbSB2YXIgKlRhYmVsbCAwNzk4NCouIERlbiBoYXIgbWVkIGFuZHJlIG9yZCBzbMOldHQgc2FtbWVuIGFsdCBzb20gaGFyIG1lZCBpbmR1c3RyaSDDpSBnasO4cmUsIGYuZWtzLiBvbGplIG9nIGdhc3MsIGJlcmd2aW5uaW5nLCBza2lwc3ZlcmZ0LCBvc3YuIHVuZGVyIGVuIG9nIHNhbW1lIGthdGVnb3JpLiBEZXR0ZSBnasO4ciBhdCBhbGxlIEdJTkkta29lZmZpc2llbnRlciB2aSByZWtuZXIgdXQgdmlsIHbDpnJlIGVrc3RyZW10IHNtw6UgZm9yZGkgZGVuIHNraWxsZXIgaWtrZSB1dCBkZSBzdG9yZSB1bGlraGV0ZW5lIG1lbGxvbSBuw6ZyaW5nZW5lIGlubmVuZm9yIGh2ZXIgYmVtZXJrZWxzZS4gRGV0dGUgaWdqZW4gbWVkZsO4cmVyIGF0IGRldCBlciB2YW5za2VsaWcgw6UgdnVyZGVyZSBHSU5JLWtvZWZmaXNpZW50ZW5lIG9wdGltYWx0LiBEZXR0ZSBlciBkZXN2ZXJyZSBldCBwcm9ibGVtIHNvbSBmw7hsZ2VyIG9zcyBnamVubm9tIHJhcHBvcnRlbiB2aWRlcmUgcMOlIGFsbGUgcmVnaW9uZXIgb2cga29tbXVuZXIgaHZvciB2aSByZWtuZXIgdXQgR0lOSS1rb2VmZmlzaWVudGVuZS4KClZpIHNlciB1dCBpZnJhIEdJTkktdmVyZGllbmUgdsOlcmVzIGZvciBIYXVnYWxhbmRldCBhdCBpbmR1c3RyaSBoYXIgZW4gbXllIGjDuHllcmUgdmVyZGkgZW5uIHByaW3DpnJuw6ZyaW5nZXIgb2cgaGVsc2V0amVuZXN0ZXIsIHNvbSB0eWRlciBww6UgYXQgZGV0IGVyIHN0w7hycmUgZ3JhZCBhdiBrbHluZ2VkYW5uZWxzZXIgYXYgaW5kdXN0cmkgaSByZWdpb25lbi4gRW4gYW5uZW4gb2JzZXJ2YXNqb24gdmVyZHQgw6UgbWVya2Ugc2VnLCBlciBhdCBibGFudCBkZSB0cmUgdW5kZXJzw7hrdGUgbsOmcmluZ2VuZSwgZXIgZGV0IGt1biDCq0luZHVzdHJpwrsgc29tIGhhciBzdGFkaWcgaGF0dCBzdGVya2VyZSBrbHluZ2V0ZW5kZW5zZXIgZGUgc2lzdGUgw6VyZW5lLiBEZXR0ZSBnamVuc3BlaWxlcyBhdiBlbiBzdGFkaWcgw7hrZW5kZSB2ZXJkaSBww6UgaW5kZWtzZW4gb3ZlciB0aWQuIFNhbW1lIG9ic2VydmFzam9uIGthbiB2aSBpa2tlIHNlIGhvcyBwcmltw6ZybsOmcmluZ2VuIGVsbGVyIGkgaGVsc2VzZWt0b3Jlbi4KCkkgcmVnaW9uZW4sIEhhdWdlbGFuZGV0LCBzZXIgdmkgYXQgbsOmcmluZ3NzdHJ1a3R1cmVuIGkgcHJpbcOmcm7DpnJpbmdlbmUgZXIgaSBzdG9yIGdyYWQgc3Blc2lhbGlzZXJ0LiBJIHRpbGxlZ2cgdGVuZGVuc2VyZXIgaW5kZWtzZW4gdGlsIMOlIMO4a2UgbWVkIHRpZC4gSSBkZSB0byBhbmRyZSBuw6ZyaW5nZW5lIGVyIGluZGVrc2VuIHJlbGF0aXYgamV2biwgZGVyIGluZHVzdHJpIGVyIGRlbiBsYXZlc3RlIG9nIGRlcm1lZCBteWUgbWVyIGRpdmVyc2lmaXNlcnQuCgojIyMjIEtvbW11bmVuaXbDpSBww6UgSGF1Z2FsYW5kZXQgKEhhdWdlc3VuZCwgS2FybcO4eSwgVHlzdsOmciBvZyBCb2tuKQoKIyMjIyMgSGF1Z2VzdW5kCgpgYGB7cn0KSGF1Z19hcmJfR0lOSSA8LSBzeXNzZWxfYXJiICU+JSAKICBmaWx0ZXIoa25yICVpbiUgIjExMDYiKQpgYGAKCmBgYHtyfQpIYXVnX2FyYl9HSU5JIDwtIEhhdWdfYXJiX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIEVpcl9Fcl9Qcmltw6ZyID0gYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9JbmR1c3RyaSA9IEluZHVzdHJpL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgRWluX0VuX1ByaW3DpnIgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9JbmR1c3RyaSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgRWluX0VuX0hlbHNlID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgTFFfUHJpbcOmciA9IEVpcl9Fcl9Qcmltw6ZyIC8gRWluX0VuX1ByaW3DpnIsCiAgICBMUV9JbmR1c3RyaSA9IEVpcl9Fcl9JbmR1c3RyaSAvIEVpbl9Fbl9JbmR1c3RyaSwKICAgIExRX0hlbHNlID0gRWlyX0VyX0hlbHNlIC8gRWluX0VuX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NCkKYGBgCgpgYGB7cn0KbmFtZXMoSGF1Z19hcmJfR0lOSSlbWzVdXSA8LSAiw4VyIgpgYGAKCmBgYHtyfQpIYXVnX2FyYl9HSU5JIDwtIEhhdWdfYXJiX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIEdJTklfUHJpbcOmciA9ICgoSGF1Z19hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBIYXVnX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0luZHVzdHJpID0gKChIYXVnX2FyYl9HSU5JJEluZHVzdHJpL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAtIEhhdWdfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKEhhdWdfYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBIYXVnX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQpgYGAKCmBgYHtyfQpIYXVnX2FyYl9HSU5JIDwtIEhhdWdfYXJiX0dJTkkgJT4lCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKEhhdWdfYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBIYXVnX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhIYXVnX2FyYl9HSU5JJEluZHVzdHJpIC8gSGF1Z19hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9IZWxzZSA9IDEgLyBhYnMoSGF1Z19hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvSGF1Z19hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSkgJT4lIAogIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoCiAgSGF1Z19hcmJfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiSGF1Z2VzdW5kOiBHaW5pICYgUkRJIj04KSkKCmthYmxlKAogIEhhdWdfYXJiX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiRWlyL0VyIiA9IDMsICJFaW4vRW4iID0gMywgIkxRIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJIYXVnZXN1bmQ6IExva2Fsa3ZvdGllbnQiPTExKSkKYGBgCgpUYWJlbGxlbiB2aXNlciBMUS12ZXJkaWVuZSBmb3IgZGUgdXR2YWxndGUgbsOmcmluZ2VuZSBpIEhhdWdlc3VuZCBrb21tdW5lLiBEZXQgc29tIGVyIHZlcmR0IMOlIGJlbWVya2UgaGVyIGVyIGlnamVuIGluZHVzdHJpZW4gb2cgaGVsc2V0amVuZXN0ZXIuIEhhdWdlc3VuZCBrb21tdW5lIGhhciBzZXR0IGVuIGtyYWZ0aWcgdmVrc3QgaW5uZW4gaW5kdXN0cmkgb2cgaGVsc2V0amVuZXN0ZXIsIG1lZCBpbmR1c3RyaSBmcmEgMS4xOSB0aWwgMS4zOCBvZyBoZWxzZXRqZW5lc3RlciBmcmEgMS4xOSB0aWwgMS4zMC4gRGV0dGUgdHlkZXIgcMOlIGtseW5nZWRhbm5lbHNlciBpbm5lbiBiw6VkZSBpbmR1c3RyaSBvZyBoZWxzZXRqZW5zdGVyIGkgSGF1Z2VzdW5kLCBub2Ugc29tIGthbiBzdGVtbWUgbXRwLiBIYXVnZXN1bmQgU2p1a2VodXMgc29tIHRpbGJ5ciB0amVuZXN0ZXIgdGlsIGhlaWxlIHJlZ2lvbmVuLiBJIHRpbGxlZ2cgZXIgSGF1Z2VzdW5kIG9nc8OlIGV0IGluZHVzdHJpIHNlbnRlciBtZWQgSGF1Z2FsYW5kIFZla3N0IGkgZnJvbnQsIHNhbXQgc3RvcnQgZm9rdXMgcMOlIGVudHJlcHJlbsO4cnNrYXAgaSBrb21tdW5lbi4KCkkgSGF1Z2VzdW5kIGtvbW11bmUgdmlzZXIgYWxsZSBvYnNlcnZhc2pvbmVuZSBzbcOlIGVsbGVyIHRpbG7DpnJtZXQgaW5nZW4gZW5kcmluZ2VyIG92ZXIgdGlkLiBJIGx5cyBhdiBrbHluZ2V0ZW5kZW5zZXIsIHNraWxsZXIgcHJpbcOmcm7DpnJpbmdlbmUgaSBIYXVnZXN1bmQgc2VnIHV0IHZlZCBhdCBpbmRla3NlbiBzeW5rZXIgb3ZlciB0aWQuIE1lZCBhbmRyZSBvcmQgdmlzZXIgcHJpbcOmcm7DpnJpbmdlbiBpbmRpa2Fzam9uZXIgcMOlIGF0IGRlbiBzcHJlciBzZWcgamV2bmVyZSB1dCBpIG1vdHNldG5pbmcgdGlsIMOlIGtseW5nZSBzZWcgc2FtbWVuLiBEZXQgZXIgb2dzw6UgdmVyZHQgw6UgdHJla2tlIGZyZW0gYXQgcHJpbcOmcm7DpnJpbmdlbmUgaGFyIHNwZXNpYWxpc2VydCBzZWcgbWVkIHRpZGVuLCBtZW5zIGluZHVzdHJpLSBvZyBoZWxzZXNla3RvcmVuIGhhciBibGl0dCBtZXIgbWFuZ2ZvbGRpZyBvZyBkaXZlcnNpZmlzZXJ0IGRldCBzaXN0ZSB0acOlcmV0LgoKIyMjIyMgQm9rbgoKYGBge3J9CkJva25fYXJiX0dJTkkgPC0gc3lzc2VsX2FyYiAlPiUgCiAgZmlsdGVyKGtuciAlaW4lICIxMTQ1IikKYGBgCgpgYGB7cn0KQm9rbl9hcmJfR0lOSSA8LSBCb2tuX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBFaXJfRXJfUHJpbcOmciA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9Qcmltw6ZyID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9IZWxzZSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfUHJpbcOmciAvIEVpbl9Fbl9Qcmltw6ZyLAogICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkgLyBFaW5fRW5fSW5kdXN0cmksCiAgICBMUV9IZWxzZSA9IEVpcl9Fcl9IZWxzZSAvIEVpbl9Fbl9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTQpCmBgYAoKYGBge3J9Cm5hbWVzKEJva25fYXJiX0dJTkkpW1s1XV0gPC0gIsOFciIKYGBgCgpgYGB7cn0KQm9rbl9hcmJfR0lOSSA8LSBCb2tuX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKEJva25fYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC0gQm9rbl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9JbmR1c3RyaSA9ICgoQm9rbl9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBCb2tuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0hlbHNlID0gKChCb2tuX2FyYl9HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gQm9rbl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0KQm9rbl9hcmJfR0lOSSA8LSBCb2tuX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBSRElfUHJpbcOmciA9IDEgLyBhYnMoQm9rbl9hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYCAvIEJva25fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gYWJzKEJva25fYXJiX0dJTkkkSW5kdXN0cmkgLyBCb2tuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0hlbHNlID0gMSAvIGFicyhCb2tuX2FyYl9HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9Cb2tuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApKSAlPiUgCiAgCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZSgKICBCb2tuX2FyYl9HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJCb2tuOiBHaW5pICYgUkRJIj04KSkKCmthYmxlKAogIEJva25fYXJiX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiRWlyL0VyIiA9IDMsICJFaW4vRW4iID0gMywgIkxRIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJCb2tuOiBMb2thbGt2b3RpZW50Ij0xMSkpCmBgYAoKSSBkZW5uZSB0YWJlbGxlbiBzZXIgdmkgTFEtdmVyZGllbiB0aWwgdXR2YWxndGUgbsOmcmluZ2VyIGkgQm9rbiBrb21tdW5lLiBIZXIgc2VyIHZpIGF0IGLDpWRlIHByaW3DpnJuw6ZyaW5nZW5lIG9nIGluZHVkc3RyaSBoYXIgc2V0dCBlbiBzdsOmcnQga3JhZnRpZyB2ZWtzdCBpIHJlZ2lvbmVuIGkgcGVyaW9kZW4gMjAwOCAtIDIwMjAuIFVuZGVyIHByaW3DpnJuw6ZyaW5nZXIgZ8OlciBqb3JkYnJ1aywgc2tvZ2JydWsgb2cgZmlza2UsIG9nIHZpIGthbiBkZXJtZWQgc2kgYXQgaGVyIGVyIGRldCBrbGFydCB0aWxzdGVkZXbDpnJlbHNlIGF2IGtseW5nZXIgaW5uZW5mb3IgcHJpbcOmcm7DpnJpbmdlbmUgb2cgaW5kdXN0cmllbiBww6UgYm9rbi4gRGV0IHR5ZGVyIG9nc8OlIHN0ZXJrdCBww6UgYXQgZGV0IGVyIHRpbHN0ZWRldsOmcmVsc2UgYXYgYmFzaXNuw6ZyaW5nZXIgaSBrb21tdW5lbi4gSGVsc2V0amVuZXN0ZXIgaGFyIHNldHQgZW4ga3JhZnRpZyByZWR1a3Nqb24uIEVuIG3DpSB2w6ZyZSBvYnNlcnZhbmcgcMOlIGVuIGZha3Rvciwgb2cgZGV0IGVyIGh2b3IgbGl0ZW4gZGVuIHRvdGFsZSBzeXNzZWxzZXRuaW5nZW4gcMOlIGJva24gZXIuIERldHRlIGdqw7hyIGF0IGVuIGxpdGVuIGVuZHJpbmcgaSBhbnRhbCBwZXJzb25lciBzb20gam9iYmVyIGlubmVuIGluZHVzdHJpIHZpbCBoYSBzdG9yZSB1dHNsYWcgcMOlIExRLXZlcmRpZW5lLiBNZW4gZGV0IGVyIGluZ2VuIHR2aWwgb20gYXQgQm9rbiBoYXIgc2V0dCBlbiBzb2xpZCB2ZWtzdCBzaXN0ZSBwZXJpb2Rlbi4gCgpHSU5JIGZyYSBuw6ZyaW5nZW5lIGkgQm9rbiBoYXIgZm9yIGxhdmUgdmVyZGllbmUgdGlsIMOlIGZhbmdlcyBvcHAgaSB2w6VyIG1ldG9kZS4gUkRJIGZyYSBuw6ZyaW5nZW5lIGkgQm9rbiBmb3J0ZWxsZXIgb3NzIGF0IGluZHVzdHJpc2VrdG9yZW4gaGFyIGJsaXR0IGJldHJha3RlbGlnIG1lciBkaXZlcnNpZmlzZXJ0IGVsbGVyIG1hbmdmb2xkaWcsIG1lbnMgaGVsc2V2ZXNlbmV0IGhhciBzcGVzaWFsaXNlcnQgbWVyIMOlcmVuZS4gSW5kZWtzZW4gcMOlIGRlIHVsaWtlIG7DpnJpbmdlbmUgaGFyIGZsdWt0dWVyZW5kZSB2ZXJkaSwgbWVuIGZyYSAyMDA4IHRpbCAyMDIwIGVyIHV0ZmFsbGV0IHNvbSBuZXZudC4KCiMjIyMjIFR5c3bDpnIKCmBgYHtyfQpUeXN2X2FyYl9HSU5JIDwtIHN5c3NlbF9hcmIgJT4lIAogIGZpbHRlcihrbnIgJWluJSAiMTE0NiIpCmBgYAoKYGBge3J9ClR5c3ZfYXJiX0dJTkkgPC0gVHlzdl9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgRWlyX0VyX1ByaW3DpnIgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fUHJpbcOmciA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgRWluX0VuX0luZHVzdHJpID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fSGVsc2UgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBMUV9Qcmltw6ZyID0gRWlyX0VyX1ByaW3DpnIgLyBFaW5fRW5fUHJpbcOmciwKICAgIExRX0luZHVzdHJpID0gRWlyX0VyX0luZHVzdHJpIC8gRWluX0VuX0luZHVzdHJpLAogICAgTFFfSGVsc2UgPSBFaXJfRXJfSGVsc2UgLyBFaW5fRW5fSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz00KQpgYGAKCmBgYHtyfQpuYW1lcyhUeXN2X2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9ClR5c3ZfYXJiX0dJTkkgPC0gVHlzdl9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgR0lOSV9Qcmltw6ZyID0gKChUeXN2X2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIFR5c3ZfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSW5kdXN0cmkgPSAoKFR5c3ZfYXJiX0dJTkkkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpIC0gVHlzdl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9IZWxzZSA9ICgoVHlzdl9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYCAtIFR5c3ZfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMikpCmBgYAoKYGBge3J9ClR5c3ZfYXJiX0dJTkkgPC0gVHlzdl9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKFR5c3ZfYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBUeXN2X2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhUeXN2X2FyYl9HSU5JJEluZHVzdHJpIC8gVHlzdl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9IZWxzZSA9IDEgLyBhYnMoVHlzdl9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvVHlzdl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSkgJT4lIAogIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoCiAgVHlzdl9hcmJfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiVHlzdsOmcjogR2luaSAmIFJESSI9OCkpCgprYWJsZSgKICBUeXN2X2FyYl9HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkVpci9FciIgPSAzLCAiRWluL0VuIiA9IDMsICJMUSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiVHlzdsOmcjoiPTExKSkKYGBgCgpJIGRlbm5lIHRhYmVsbGVuIHNlciB2aSBMUS12ZXJkaWVuZSBmb3IgVHlzdsOmci4gVmkgc2VyIG1lZCBlbiBnYW5nIGF0IFR5c3bDpnIgaGFyIHNldHQgZW4gZW5vcm0gdmVrc3QgaW5uZW4gaW5kdXN0cmkgaSBwZXJpb2RlbiAyMDA4IC0gMjAyMC4gTWVkIGVuIHZlcmRpIHDDpSAxLjcxIHPDpSB0eWRlciBkZXQgcMOlIGF0IGRldCBlciB0aWxzdGVkZXbDpnJlbHNlIGF2IGtseW5nZXIgb2cgYmFzaXNuw6ZyaW5nIGlubmVuIGluZHVzdHJpIGkga29tbXVuZW4uIFByaW3DpnJuw6ZyaW5nZW5lIGhhciBzZXR0IGV0IGtyYWZ0aWcgZmFsbCwgc2FtbWUgZ2plbGRlciBvZ3PDpSBoZWxzZXRqZW5lc3RlciBpIGtvbW11bmVuLgoKR0lOSSBmcmEgbsOmcmluZ2VuZSBpIFR5c3bDpnIga29tbXVuZSBoYXIgb2dzw6UgbGF2ZSB2ZXJkaWVyIGkgdsOlciBza2FsYS4gVmkgc2VyIGRvZyBhdCBwcmltw6ZybsOmcmluZ2VuZSBvZyBpbmR1c3RyaXNla3RvcmVuIHV0dmlrbGVyIHNlZyBpIG1vdHNhdHQgcmV0bmluZyBhdiBodmVyYW5kcmUuIFByaW3DpnJuw6ZyaW5nZW5lIHZpc2VyIHNtw6UgdGVuZGVuc2VyIHRpbCDDpSBkZXNlbnRyYWxpc2VyZSBzZWcsIG1lbnMgZm9yIGRlIGFuZHJlIG7DpnJpbmdlbmUgbWFuZ2xlciB2aSByZXByZXNlbnRhdGl2IGRhdGEuCgpSREkgZnJhIG7DpnJpbmdlbmUgaSBUeXN2w6ZyIGZvcnRlbGxlciBvc3MgYXQgZGV0IGt1biBlciBwcmltw6ZybsOmcmluZ2VuZSBzb20gaGFyIHNwZXNpYWxpc2VydCBzZWcsIG1lbnMgZGUgdG8gcmVzdGVyZW5kZSBuw6ZyaW5nZW5lIHZpc2VyIHN0YWRpZyBzeW5rZW5kZSB2ZXJkaWVyIG92ZXIgdGlkIHNvbSBramVubmV0ZWduZXMgdmVkIGF0IGRlIGJsaXIgbWVyIG1hbmdmb2xkaWcgb2cgZGl2ZXJzaWZpc2VydC4KCiMjIyMjIEthcm3DuHkKCmBgYHtyfQpLYXJtX2FyYl9HSU5JIDwtIHN5c3NlbF9hcmIgJT4lIAogIGZpbHRlcihrbnIgJWluJSAiMTE0OSIpCmBgYAoKYGBge3J9Ckthcm1fYXJiX0dJTkkgPC0gS2FybV9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgRWlyX0VyX1ByaW3DpnIgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fUHJpbcOmciA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgRWluX0VuX0luZHVzdHJpID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fSGVsc2UgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBMUV9Qcmltw6ZyID0gRWlyX0VyX1ByaW3DpnIgLyBFaW5fRW5fUHJpbcOmciwKICAgIExRX0luZHVzdHJpID0gRWlyX0VyX0luZHVzdHJpIC8gRWluX0VuX0luZHVzdHJpLAogICAgTFFfSGVsc2UgPSBFaXJfRXJfSGVsc2UgLyBFaW5fRW5fSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz00KQpgYGAKCmBgYHtyfQpuYW1lcyhLYXJtX2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9Ckthcm1fYXJiX0dJTkkgPC0gS2FybV9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgR0lOSV9Qcmltw6ZyID0gKChLYXJtX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIEthcm1fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSW5kdXN0cmkgPSAoKEthcm1fYXJiX0dJTkkkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpIC0gS2FybV9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9IZWxzZSA9ICgoS2FybV9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYCAtIEthcm1fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMikpCmBgYAoKYGBge3J9Ckthcm1fYXJiX0dJTkkgPC0gS2FybV9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKEthcm1fYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBLYXJtX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhLYXJtX2FyYl9HSU5JJEluZHVzdHJpIC8gS2FybV9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9IZWxzZSA9IDEgLyBhYnMoS2FybV9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvS2FybV9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSkgJT4lIAogIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoCiAgS2FybV9hcmJfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiS2FybcO4eTogR2luaSAmIFJESSI9OCkpCgprYWJsZSgKICBLYXJtX2FyYl9HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkVpci9FciIgPSAzLCAiRWluL0VuIiA9IDMsICJMUSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiS2FybcO4eTogTG9rYWxrdm90aWVudCI9MTEpKQpgYGAKCkkgZGVubmUgdGFiZWxsZW4gc2VyIHZpIExRLXZlcmRpZW5lIGZvciBLYXJtw7h5IGtvbW11bmUuIFV0IGZyYSB0YWJlbGxlbiBrYW4gdmkgc2UgYXQgYsOlZGUgcHJpbcOmcm7DpnJpbmdlbmUgb2cgaW5kdXN0cmllbiBww6UgS2FybcO4eSBoYXIgc2V0dCBlbiByZWR1a3Nqb24gb3ZlciB0aWQuIFByaW3DpnJuw6ZyaW5nZW5lIHNlciB1dCB0aWwgw6UgYmFyZSBmb3J0c2V0dGUgw6Ugc3lua2UsIG1lbnMgaW5kdXN0cmllbiBoYXIgYmVneW50IMOlIHNqw6UgZW4gbGl0ZW4gdmVrc3QgZnJhIDIwMTQgZnJlbSB0aWwgaSBkYWcuIERldCBlciBrbGFydCB0aWxzdGVkZXbDpnJlbHNlIGF2IGtseW5nZXIgaW5uZW4gaW5kdXN0cmkgcMOlIEthcm3DuHkgb2cgZGV0IGVyIGRlZmluaXRpdiBiYXNpc27DpnJpbmcgZGVyLCBtdHAgYmxhbnQgYW5uZXQgSHlkcm8gS2FybcO4eS4gSGVsc2V2ZXNlbmV0IGhhciBnw6V0dCBvcHAgb2cgbmVkIGkgcGVyaW9kZW4sIG1lbiBoYXIgdmVydCByZWxhdGl2dCBqZXZudCBydW5kdCAxLgoKSSBLYXJtw7h5IG1hbmdsZXIgdmkgcmVwcmVzZW50YXRpdiBkYXRhIGZvciBkZW4gcm9tbGlnZSBHaW5pLWluZGVrc2VuIGZvciBoZWxzZXNla3RvcmVuLCBtZW4ga29ydCBvcHBzdW1tZXJ0IHNlciB2aSBrbHluZ2V0ZW5kZW5zZXIgaSBpbmR1c3RyaW7DpnJpbmdlbiwgbWVuIHNtw6UgZmx1a3R1YXNqb25lciBpIHByaW3DpnJuw6ZyaW5nZXIuCgpSREktaW5kZWtzZW4gdmlzZXIgc2FtbWUgbml2w6UgYXYgZmx1a3R1YXNqb25lciBpIHByaW3DpnJuw6ZyaW5nZXIuIERldCBmcmVta29tbWVyIHNvbSBlbiBzcGVzaWFsaXNlcnQgbsOmcmluZ2VuIG1lZCBzbcOlIGVuZHJpbmdlciBpIHNhbW1lbnNldG5pbmcgb3ZlciB0aWQuIEkgSW5kdXN0cmllbiBvZyBoZWxzZXNla3RvcmVuIHNlciB2aSBkZXJpbW90IMO4a2VuZGUgZ3JhZCBhdiBzcGVzaWFsaXNlcmluZyBqZXZudCBvdmVyIHRpZC4KCi0tIE9wcHN1bW1lcmluZyBydW5kdCBIYXVnYWxhbmRldC0tCgpDb21taXR0aW5ncwoKIyMjIFN1bm5ob3JkbGFuZCAyMDA4LTIwMjAKCi0gICBFaXJfRXJfSm9yZGJydWsgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQKLSAgIEVpcl9Fcl9JbmR1c3RyaSA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEluZHVzdHJpLXNla3RvcmVuIGkgcmVnaW9uIFN1bm5ob3JkbGFuZAotICAgRWlyX0VyX0VsX1Zhbm5fUmVubyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEVsZWtldHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbi1zZWt0b3JlbiBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQKLSAgIEVpcl9Fcl9CeWdnX29nX0FubGVnZyA9IFNhbWxldCBzeXNzZWxzZXR0aW5nIGlubmVuIEJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldC1zZWt0b3JlbiBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQKLSAgIEVpcl9Fcl9GaW5hbnMgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZy1zZWt0b3JlbiBpIHJlZ2lvbiBTdW5uaG9yZGxhbmQKLSAgIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBVbmRlcnZpc25pbmctc2VrdG9yZW4gaSByZWdpb24gU3VubmhvcmRsYW5kCi0gICBFaXJfRXJfSGVsc2UgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyLXNla3RvcmVuIGkgcmVnaW9uIFN1bm5ob3JkbGFuZAoKYGBge3Igc3VuX2luZHVzdHJpfQpzdW5fYXJiX0xRIDwtIHN1bl9hcmIgJT4lIAogICMgU2xpayBmaW5uZXIgdmkgc2FtbGV0IHN5c3NlbHNldHRpbmcgaSBJbmR1c3RyaSBpIFN1bm5ob3JkbGFuZCBmb3Igw6VyIDIwMDgtMjAyMAogIG11dGF0ZShFaXJfRXJfSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfRWxfVmFubl9SZW5vID0gYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cgPSBgQnlnZ2UtIG9nIEFubmxlZ2dzdmlya3NvbWhldGAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0ZpbmFucyA9IGBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZ2AvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX1VuZGVydmlzbmluZyA9IFVuZGVydmlzbmluZy9gQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICBFaXJfRXJfSGVsc2UgPSBgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9Kb3JkYnJ1ayA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKCiAgICAgICAgIEVpbl9Fbl9JbmR1c3RyaSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKCiAgICAgICAgIEVpbl9Fbl9FbF9WYW5uX1Jlbm8gPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEVsZWt0cmlzaXRldCwgVmFubiBvZyBSZW5vdmFzam9uYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9CeWdnX29nX0FubGVnZyA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0YC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9GaW5hbnMgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEZpbmFuc2llcmluZyBvZyBGb3JzaWtyaW5nYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9VbmRlcnZpc25pbmcgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkVW5kZXJ2aXNuaW5nL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgICAgICAKICAgICAgICAgRWluX0VuX0hlbHNlID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfSm9yZGJydWsvRWluX0VuX0pvcmRicnVrLAogICAgICAgICBMUV9JbmR1c3RyaSA9IEVpcl9Fcl9JbmR1c3RyaS9FaW5fRW5fSW5kdXN0cmksCiAgICAgICAgIExRX0VsX1Zhbm5fUmVubyA9IEVpcl9Fcl9FbF9WYW5uX1Jlbm8vRWluX0VuX0VsX1Zhbm5fUmVubywKICAgICAgICAgTFFfQnlnZ19vZ19BbmxlZ2cgPSBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cvRWluX0VuX0J5Z2dfb2dfQW5sZWdnLAogICAgICAgICBMUV9GaW5hbnMgPSBFaXJfRXJfRmluYW5zL0Vpbl9Fbl9GaW5hbnMsCiAgICAgICAgIExRX1VuZGVydmlzbmluZyA9IEVpcl9Fcl9VbmRlcnZpc25pbmcvRWluX0VuX1VuZGVydmlzbmluZywKICAgICAgICAgTFFfSGVsc2UgPSBFaXJfRXJfSGVsc2UvRWluX0VuX0hlbHNlCikgJT4lIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9FbF9WYW5uX1Jlbm8sIExRX0J5Z2dfb2dfQW5sZWdnLCBMUV9GaW5hbnMsIExRX1VuZGVydmlzbmluZywgTFFfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZShzdW5fYXJiX0xRLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSm9yZGJydWsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFubiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCeWdnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbmFucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmRlcnYuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiTG9rYWxrdm90aWVudGVuLCByZWdpb246IFN1bm5ob3JkbGFuZCI9OSkpCmBgYAoKYGBge3J9CnN1bl9hcmJfR0lOSSA8LSBzdW5fYXJiICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKHN1bl9hcmIkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC0gc3VuX2FyYiRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9JbmR1c3RyaSA9ICgoc3VuX2FyYiRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBzdW5fYXJiJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0hlbHNlID0gKChzdW5fYXJiJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gc3VuX2FyYiRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0Kc3VuX2FyYl9HSU5JIDwtIHN1bl9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKHN1bl9hcmIkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBzdW5fYXJiJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAKICAgIFJESV9JbmR1c3RyaSA9IDEgLyBhYnMoc3VuX2FyYiRJbmR1c3RyaSAvIHN1bl9hcmIkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpIC8gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApLAogIAogICAgUkRJX0hlbHNlID0gMSAvIGFicyhzdW5fYXJiJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9zdW5fYXJiJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApKSAlPiUgCiAgCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZShzdW5fYXJiX0dJTkksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJSZWdpb246IFN1bm5ob3JkbGFuZCI9OCkpCmBgYAoKIyMjIyBLb21tdW5lbml2w6UgaSBTdW5uaG9yZGxhbmQgKFN0b3JkLCBLdmlubmhlcmFkLCBCw7htbG8gb2cgU3ZlaW8pCgojIyMjIyBTdG9yZAoKYGBge3J9ClN0b3JkX2FyYl9HSU5JIDwtIHN5c3NlbF9hcmIgJT4lIAogIGZpbHRlcihrbnIgJWluJSAiNDYxNCIpCmBgYAoKYGBge3J9ClN0b3JkX2FyYl9HSU5JIDwtIFN0b3JkX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBFaXJfRXJfUHJpbcOmciA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9Qcmltw6ZyID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9IZWxzZSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfUHJpbcOmciAvIEVpbl9Fbl9Qcmltw6ZyLAogICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkgLyBFaW5fRW5fSW5kdXN0cmksCiAgICBMUV9IZWxzZSA9IEVpcl9Fcl9IZWxzZSAvIEVpbl9Fbl9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTQpCmBgYAoKYGBge3J9Cm5hbWVzKFN0b3JkX2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9ClN0b3JkX2FyYl9HSU5JIDwtIFN0b3JkX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKFN0b3JkX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIFN0b3JkX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0luZHVzdHJpID0gKChTdG9yZF9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBTdG9yZF9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9IZWxzZSA9ICgoU3RvcmRfYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBTdG9yZF9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0KU3RvcmRfYXJiX0dJTkkgPC0gU3RvcmRfYXJiX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIFJESV9Qcmltw6ZyID0gMSAvIGFicyhTdG9yZF9hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYCAvIFN0b3JkX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhTdG9yZF9hcmJfR0lOSSRJbmR1c3RyaSAvIFN0b3JkX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0hlbHNlID0gMSAvIGFicyhTdG9yZF9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvU3RvcmRfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkpICU+JSAKICAKICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpCmBgYAoKYGBge3J9CmthYmxlKAogIFN0b3JkX2FyYl9HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJTdG9yZDogR2luaSAmIFJESSI9OCkpCgprYWJsZSgKICBTdG9yZF9hcmJfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJFaXIvRXIiID0gMywgIkVpbi9FbiIgPSAzLCAiTFEiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlN0b3JkOiBMb2thbGt2b3RpZW50Ij0xMSkpCmBgYAoKIyMjIyMgS3Zpbm5oZXJhZAoKYGBge3J9Ckt2aW5uX2FyYl9HSU5JIDwtIHN5c3NlbF9hcmIgJT4lIAogIGZpbHRlcihrbnIgJWluJSAiNDYxNyIpCmBgYAoKYGBge3J9Ckt2aW5uX2FyYl9HSU5JIDwtIEt2aW5uX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBFaXJfRXJfUHJpbcOmciA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9Qcmltw6ZyID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9IZWxzZSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfUHJpbcOmciAvIEVpbl9Fbl9Qcmltw6ZyLAogICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkgLyBFaW5fRW5fSW5kdXN0cmksCiAgICBMUV9IZWxzZSA9IEVpcl9Fcl9IZWxzZSAvIEVpbl9Fbl9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTQpCmBgYAoKYGBge3J9Cm5hbWVzKEt2aW5uX2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9Ckt2aW5uX2FyYl9HSU5JIDwtIEt2aW5uX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKEt2aW5uX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIEt2aW5uX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0luZHVzdHJpID0gKChLdmlubl9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBLdmlubl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9IZWxzZSA9ICgoS3Zpbm5fYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBLdmlubl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0KS3Zpbm5fYXJiX0dJTkkgPC0gS3Zpbm5fYXJiX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIFJESV9Qcmltw6ZyID0gMSAvIGFicyhLdmlubl9hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYCAvIEt2aW5uX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhLdmlubl9hcmJfR0lOSSRJbmR1c3RyaSAvIEt2aW5uX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0hlbHNlID0gMSAvIGFicyhLdmlubl9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvS3Zpbm5fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkpICU+JSAKICAKICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpCmBgYAoKYGBge3J9CmthYmxlKAogIEt2aW5uX2FyYl9HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJLdmlubmhlcmFkOiBHaW5pICYgUkRJIj04KSkKCmthYmxlKAogIEt2aW5uX2FyYl9HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkVpci9FciIgPSAzLCAiRWluL0VuIiA9IDMsICJMUSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiS3Zpbm5oZXJhZDogTG9rYWxrdm90aWVudCI9MTEpKQpgYGAKCiMjIyMjIELDuG1sbwoKYGBge3J9CkLDuG1sb19hcmJfR0lOSSA8LSBzeXNzZWxfYXJiICU+JSAKICBmaWx0ZXIoa25yICVpbiUgIjQ2MTMiKQpgYGAKCmBgYHtyfQpCw7htbG9fYXJiX0dJTkkgPC0gQsO4bWxvX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBFaXJfRXJfUHJpbcOmciA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9Qcmltw6ZyID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9IZWxzZSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfUHJpbcOmciAvIEVpbl9Fbl9Qcmltw6ZyLAogICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkgLyBFaW5fRW5fSW5kdXN0cmksCiAgICBMUV9IZWxzZSA9IEVpcl9Fcl9IZWxzZSAvIEVpbl9Fbl9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTQpCmBgYAoKYGBge3J9Cm5hbWVzKELDuG1sb19hcmJfR0lOSSlbWzVdXSA8LSAiw4VyIgpgYGAKCmBgYHtyfQpCw7htbG9fYXJiX0dJTkkgPC0gQsO4bWxvX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKELDuG1sb19hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBCw7htbG9fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSW5kdXN0cmkgPSAoKELDuG1sb19hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBCw7htbG9fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKELDuG1sb19hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYCAtIELDuG1sb19hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0KQsO4bWxvX2FyYl9HSU5JIDwtIELDuG1sb19hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKELDuG1sb19hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYCAvIELDuG1sb19hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9JbmR1c3RyaSA9IDEgLyBhYnMoQsO4bWxvX2FyYl9HSU5JJEluZHVzdHJpIC8gQsO4bWxvX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0hlbHNlID0gMSAvIGFicyhCw7htbG9fYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL0LDuG1sb19hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSkgJT4lIAogIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoCiAgQsO4bWxvX2FyYl9HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJCw7htbG86IEdpbmkgJiBSREkiPTgpKQoKa2FibGUoCiAgQsO4bWxvX2FyYl9HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkVpci9FciIgPSAzLCAiRWluL0VuIiA9IDMsICJMUSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiQsO4bWxvOiBMb2thbGt2b3RpZW50Ij0xMSkpCmBgYAoKIyMjIyMgU3ZlaW8KCmBgYHtyfQpTdmVpb19hcmJfR0lOSSA8LSBzeXNzZWxfYXJiICU+JSAKICBmaWx0ZXIoa25yICVpbiUgIjQ2MTIiKQpgYGAKCmBgYHtyfQpTdmVpb19hcmJfR0lOSSA8LSBTdmVpb19hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgRWlyX0VyX1ByaW3DpnIgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fUHJpbcOmciA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgRWluX0VuX0luZHVzdHJpID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fSGVsc2UgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBMUV9Qcmltw6ZyID0gRWlyX0VyX1ByaW3DpnIgLyBFaW5fRW5fUHJpbcOmciwKICAgIExRX0luZHVzdHJpID0gRWlyX0VyX0luZHVzdHJpIC8gRWluX0VuX0luZHVzdHJpLAogICAgTFFfSGVsc2UgPSBFaXJfRXJfSGVsc2UgLyBFaW5fRW5fSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz00KQpgYGAKCmBgYHtyfQpuYW1lcyhTdmVpb19hcmJfR0lOSSlbWzVdXSA8LSAiw4VyIgpgYGAKCmBgYHtyfQpTdmVpb19hcmJfR0lOSSA8LSBTdmVpb19hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgR0lOSV9Qcmltw6ZyID0gKChTdmVpb19hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBTdmVpb19hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9JbmR1c3RyaSA9ICgoU3ZlaW9fYXJiX0dJTkkkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJEluZHVzdHJpIC0gU3ZlaW9fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKFN2ZWlvX2FyYl9HSU5JJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gU3ZlaW9fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMikpCmBgYAoKYGBge3J9ClN2ZWlvX2FyYl9HSU5JIDwtIFN2ZWlvX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBSRElfUHJpbcOmciA9IDEgLyBhYnMoU3ZlaW9fYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBTdmVpb19hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9JbmR1c3RyaSA9IDEgLyBhYnMoU3ZlaW9fYXJiX0dJTkkkSW5kdXN0cmkgLyBTdmVpb19hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgICAKICAgIFJESV9IZWxzZSA9IDEgLyBhYnMoU3ZlaW9fYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL1N2ZWlvX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApKSAlPiUgCiAgCiAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSwgR0lOSV9Qcmltw6ZyLCBHSU5JX0luZHVzdHJpLCBHSU5JX0hlbHNlLCBSRElfUHJpbcOmciwgUkRJX0luZHVzdHJpLCBSRElfSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz02KQpgYGAKCmBgYHtyfQprYWJsZSgKICBTdmVpb19hcmJfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiU3ZlaW86IEdpbmkgJiBSREkiPTgpKQoKa2FibGUoCiAgU3ZlaW9fYXJiX0dJTkkgJT4lIAogICAgc2VsZWN0KMOFciwgYEFsbGUgTsOmcmluZ2VyYCwgRWlyX0VyX1ByaW3DpnIsIEVpcl9Fcl9JbmR1c3RyaSwgRWlyX0VyX0hlbHNlLCBFaW5fRW5fUHJpbcOmciwgRWluX0VuX0luZHVzdHJpLCBFaW5fRW5fSGVsc2UsIExRX1ByaW3DpnIsIExRX0luZHVzdHJpLCBMUV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiRWlyL0VyIiA9IDMsICJFaW4vRW4iID0gMywgIkxRIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJTdmVpbzogTG9rYWxrdm90aWVudCI9MTEpKQpgYGAKCiMjIyBIYXJkYW5nZXIgMjAwOC0yMDIwCgotICAgRWlyX0VyX0pvcmRicnVrID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaSByZWdpb24gSGFyZGFuZ2VyCi0gICBFaXJfRXJfSW5kdXN0cmkgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBJbmR1c3RyaS1zZWt0b3JlbiBpIHJlZ2lvbiBIYXJkYW5nZXIKLSAgIEVpcl9Fcl9FbF9WYW5uX1Jlbm8gPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBFbGVrZXRyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb24tc2VrdG9yZW4gaSByZWdpb24gSGFyZGFuZ2VyCi0gICBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cgPSBTYW1sZXQgc3lzc2Vsc2V0dGluZyBpbm5lbiBCeWdnZS0gb2cgQW5sZWdnc3Zpcmtzb21oZXQtc2VrdG9yZW4gaSByZWdpb24gSGFyZGFuZ2VyCi0gICBFaXJfRXJfRmluYW5zID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gRmluYW5zaWVyaW5nIG9nIEZvcnNpa3Jpbmctc2VrdG9yZW4gaSByZWdpb24gSGFyZGFuZ2VyCi0gICBFaXJfRXJfVW5kZXJ2aXNuaW5nID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gVW5kZXJ2aXNuaW5nLXNla3RvcmVuIGkgcmVnaW9uIEhhcmRhbmdlcgotICAgRWlyX0VyX0hlbHNlID0gU2FtbGV0IHN5c3NlbHNldHRpbmcgaW5uZW4gSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3Rlci1zZWt0b3JlbiBpIHJlZ2lvbiBIYXJkYW5nZXIKCmBgYHtyIGhhcl9pbmR1c3RyaX0KaGFyX2FyYl9MUSA8LSBoYXJfYXJiICU+JSAKICAjIFNsaWsgZmlubmVyIHZpIHNhbWxldCBzeXNzZWxzZXR0aW5nIGkgSW5kdXN0cmkgaSBIYXJkYW5nZXIgZm9yIMOlciAyMDA4LTIwMjAKICBtdXRhdGUoRWlyX0VyX0pvcmRicnVrID0gYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0VsX1Zhbm5fUmVubyA9IGBFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbmAvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0J5Z2dfb2dfQW5sZWdnID0gYEJ5Z2dlLSBvZyBBbm5sZWdnc3Zpcmtzb21oZXRgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9GaW5hbnMgPSBgRmluYW5zaWVyaW5nIG9nIEZvcnNpa3JpbmdgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBVbmRlcnZpc25pbmcvYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBFaW5fRW5fSm9yZGJydWsgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCgogICAgICAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCgogICAgICAgICBFaW5fRW5fRWxfVmFubl9SZW5vID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBFbGVrdHJpc2l0ZXQsIFZhbm4gb2cgUmVub3Zhc2pvbmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBFaW5fRW5fQnlnZ19vZ19BbmxlZ2cgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEJ5Z2dlLSBvZyBBbmxlZ2dzdmlya3NvbWhldGAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBFaW5fRW5fRmluYW5zID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZ2AvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBFaW5fRW5fVW5kZXJ2aXNuaW5nID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJFVuZGVydmlzbmluZy9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgICAgICAgCiAgICAgICAgIEVpbl9Fbl9IZWxzZSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAgICAgIAogICAgICAgICBMUV9Qcmltw6ZyID0gRWlyX0VyX0pvcmRicnVrL0Vpbl9Fbl9Kb3JkYnJ1aywKICAgICAgICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkvRWluX0VuX0luZHVzdHJpLAogICAgICAgICBMUV9FbF9WYW5uX1Jlbm8gPSBFaXJfRXJfRWxfVmFubl9SZW5vL0Vpbl9Fbl9FbF9WYW5uX1Jlbm8sCiAgICAgICAgIExRX0J5Z2dfb2dfQW5sZWdnID0gRWlyX0VyX0J5Z2dfb2dfQW5sZWdnL0Vpbl9Fbl9CeWdnX29nX0FubGVnZywKICAgICAgICAgTFFfRmluYW5zID0gRWlyX0VyX0ZpbmFucy9FaW5fRW5fRmluYW5zLAogICAgICAgICBMUV9VbmRlcnZpc25pbmcgPSBFaXJfRXJfVW5kZXJ2aXNuaW5nL0Vpbl9Fbl9VbmRlcnZpc25pbmcsCiAgICAgICAgIExRX0hlbHNlID0gRWlyX0VyX0hlbHNlL0Vpbl9Fbl9IZWxzZQopICU+JSAKICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfRWxfVmFubl9SZW5vLCBMUV9CeWdnX29nX0FubGVnZywgTFFfRmluYW5zLCBMUV9VbmRlcnZpc25pbmcsIExRX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoaGFyX2FyYl9MUSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpvcmRicnVrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbm4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQnlnZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaW5hbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5kZXJ2LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkxva2Fsa3ZvdGllbnQsIHJlZ2lvbjogSGFyZGFuZ2VyIj05KSkKYGBgCgpgYGB7cn0KaGFyX2FyYl9HSU5JIDwtIGhhcl9hcmIgJT4lIAogIG11dGF0ZSgKICAgIEdJTklfUHJpbcOmciA9ICgoaGFyX2FyYiRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBoYXJfYXJiJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0luZHVzdHJpID0gKChoYXJfYXJiJEluZHVzdHJpL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAtIGhhcl9hcmIkYEFsbGUgTsOmcmluZ2VyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKGhhcl9hcmIkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBoYXJfYXJiJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpKQpgYGAKCmBgYHtyfQpoYXJfYXJiX0dJTkkgPC0gaGFyX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBSRElfUHJpbcOmciA9IDEgLyBhYnMoaGFyX2FyYiRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIGhhcl9hcmIkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgIC8gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApLAogIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhoYXJfYXJiJEluZHVzdHJpIC8gaGFyX2FyYiRgQWxsZSBOw6ZyaW5nZXJgIC0KICBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLyBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCksCiAgCiAgICBSRElfSGVsc2UgPSAxIC8gYWJzKGhhcl9hcmIkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2hhcl9hcmIkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkpICAlPiUKICAKICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpCmBgYAoKYGBge3J9CmthYmxlKGhhcl9hcmJfR0lOSSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJHSU5JIiA9IDMsICJSREkiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIlJlZ2lvbjogSGFyZGFuZ2VyIj04KSkKYGBgCgojIyMjIEtvbW11bmVuaXbDpSBpIEhhcmRhbmdlciAoT2RkYSBvZyBVbGxlbnN2YW5nKQoKIyMjIyMgT2RkYQoKYGBge3J9Cm5hc2pvX2FyYl9yZWQgPC0gbmFzam9uYWx0X2FyYmVpZHNzdGVkICU+JSAKICBmaWx0ZXIoYWFyICVpbiUgYygyMDA4OjIwMTkpKQpgYGAKCmBgYHtyfQpPZGRhX2FyYl9HSU5JIDwtIHN5c3NlbF9hcmIgJT4lIAogIGZpbHRlcihrbnIgJWluJSAiMTIyOCIpCmBgYAoKYGBge3J9Ck9kZGFfYXJiX0dJTkkgPC0gT2RkYV9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgRWlyX0VyX1ByaW3DpnIgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKICAgIEVpcl9Fcl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fUHJpbcOmciA9IG5hc2pvX2FyYl9yZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAvbmFzam9fYXJiX3JlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb19hcmJfcmVkJEluZHVzdHJpL25hc2pvX2FyYl9yZWQkYEFsbGUgTsOmcmluZ2VyYCwKICAgIAogICAgRWluX0VuX0hlbHNlID0gbmFzam9fYXJiX3JlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9fYXJiX3JlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBMUV9Qcmltw6ZyID0gRWlyX0VyX1ByaW3DpnIgLyBFaW5fRW5fUHJpbcOmciwKICAgIExRX0luZHVzdHJpID0gRWlyX0VyX0luZHVzdHJpIC8gRWluX0VuX0luZHVzdHJpLAogICAgTFFfSGVsc2UgPSBFaXJfRXJfSGVsc2UgLyBFaW5fRW5fSGVsc2UpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz00KQpgYGAKCmBgYHtyfQpuYW1lcyhPZGRhX2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9Ck9kZGFfYXJiX0dJTkkgPC0gT2RkYV9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgR0lOSV9Qcmltw6ZyID0gKChPZGRhX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvX2FyYl9yZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLSBPZGRhX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9fYXJiX3JlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9JbmR1c3RyaSA9ICgoT2RkYV9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb19hcmJfcmVkJEluZHVzdHJpIC0gT2RkYV9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvX2FyYl9yZWQkYEFsbGUgTsOmcmluZ2VyYCleMiksCiAgICAKICAgIEdJTklfSGVsc2UgPSAoKE9kZGFfYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvX2FyYl9yZWQkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgIC0gT2RkYV9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvX2FyYl9yZWQkYEFsbGUgTsOmcmluZ2VyYCleMikpCmBgYAoKYGBge3J9Ck9kZGFfYXJiX0dJTkkgPC0gT2RkYV9hcmJfR0lOSSAlPiUgCiAgbXV0YXRlKAogICAgUkRJX1ByaW3DpnIgPSAxIC8gYWJzKE9kZGFfYXJiX0dJTkkkYEpvcmRicnVrLCBTa29nYnJ1ZyBvZyBGaXNrZWAgLyBPZGRhX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvX2FyYl9yZWQkYEpvcmRicnVrLCBTa29nYnJ1ayBvZyBGaXNrZWAgLyBuYXNqb19hcmJfcmVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSW5kdXN0cmkgPSAxIC8gYWJzKE9kZGFfYXJiX0dJTkkkSW5kdXN0cmkgLyBPZGRhX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvX2FyYl9yZWQkSW5kdXN0cmkgLyBuYXNqb19hcmJfcmVkJGBBbGxlIE7DpnJpbmdlcmApLAogICAgCiAgICBSRElfSGVsc2UgPSAxIC8gYWJzKE9kZGFfYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL09kZGFfYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9fYXJiX3JlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9fYXJiX3JlZCRgQWxsZSBOw6ZyaW5nZXJgKSkgJT4lIAogIAogIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCBkaWdpdHM9NikKYGBgCgpgYGB7cn0Ka2FibGUoCiAgT2RkYV9hcmJfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSksCiAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCLDhXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkdJTkkiID0gMywgIlJESSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiT2RkYSgtMjAxOSk6IEdpbmkgJiBSREkiPTgpKQoKa2FibGUoCiAgT2RkYV9hcmJfR0lOSSAlPiUgCiAgICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIikpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiPTIsICJFaXIvRXIiID0gMywgIkVpbi9FbiIgPSAzLCAiTFEiID0gMykpICU+JSAKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIk9kZGEoLTIwMTkpOiBMb2thbGt2b3RpZW50Ij0xMSkpCmBgYAoKIyMjIyMgVWxsZW5zdmFuZwoKYGBge3J9ClVsbGVuX2FyYl9HSU5JIDwtIHN5c3NlbF9hcmIgJT4lIAogIGZpbHRlcihrbnIgJWluJSAiNDYxOCIpCmBgYAoKYGBge3J9ClVsbGVuX2FyYl9HSU5JIDwtIFVsbGVuX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBFaXJfRXJfUHJpbcOmciA9IGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICBFaXJfRXJfSW5kdXN0cmkgPSBJbmR1c3RyaS9gQWxsZSBOw6ZyaW5nZXJgLAogICAgRWlyX0VyX0hlbHNlID0gYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL2BBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9Qcmltw6ZyID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBKb3JkYnJ1aywgU2tvZ2JydWsgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgLAogICAgCiAgICBFaW5fRW5fSW5kdXN0cmkgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIEVpbl9Fbl9IZWxzZSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmAsCiAgICAKICAgIExRX1ByaW3DpnIgPSBFaXJfRXJfUHJpbcOmciAvIEVpbl9Fbl9Qcmltw6ZyLAogICAgTFFfSW5kdXN0cmkgPSBFaXJfRXJfSW5kdXN0cmkgLyBFaW5fRW5fSW5kdXN0cmksCiAgICBMUV9IZWxzZSA9IEVpcl9Fcl9IZWxzZSAvIEVpbl9Fbl9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTQpCmBgYAoKYGBge3J9Cm5hbWVzKFVsbGVuX2FyYl9HSU5JKVtbNV1dIDwtICLDhXIiCmBgYAoKYGBge3J9ClVsbGVuX2FyYl9HSU5JIDwtIFVsbGVuX2FyYl9HSU5JICU+JSAKICBtdXRhdGUoCiAgICBHSU5JX1ByaW3DpnIgPSAoKFVsbGVuX2FyYl9HSU5JJGBKb3JkYnJ1aywgU2tvZ2JydWcgb2cgRmlza2VgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAtIFVsbGVuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAvbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBBbGxlIE7DpnJpbmdlcmApXjIpLAogICAgCiAgICBHSU5JX0luZHVzdHJpID0gKChVbGxlbl9hcmJfR0lOSSRJbmR1c3RyaS9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkSW5kdXN0cmkgLSBVbGxlbl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSwKICAgIAogICAgR0lOSV9IZWxzZSA9ICgoVWxsZW5fYXJiX0dJTkkkYEhlbHNlLSBvZyBTb3NpYWx0amVuZXN0ZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAgLSBVbGxlbl9hcmJfR0lOSSRgQWxsZSBOw6ZyaW5nZXJgL25hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKV4yKSkKYGBgCgpgYGB7cn0KVWxsZW5fYXJiX0dJTkkgPC0gVWxsZW5fYXJiX0dJTkkgJT4lIAogIG11dGF0ZSgKICAgIFJESV9Qcmltw6ZyID0gMSAvIGFicyhVbGxlbl9hcmJfR0lOSSRgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYCAvIFVsbGVuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYCAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0luZHVzdHJpID0gMSAvIGFicyhVbGxlbl9hcmJfR0lOSSRJbmR1c3RyaSAvIFVsbGVuX2FyYl9HSU5JJGBBbGxlIE7DpnJpbmdlcmAgLQogIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRJbmR1c3RyaSAvIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCRgQWxsZSBOw6ZyaW5nZXJgKSwKICAgIAogICAgUkRJX0hlbHNlID0gMSAvIGFicyhVbGxlbl9hcmJfR0lOSSRgSGVsc2UtIG9nIFNvc2lhbHRqZW5lc3RlcmAvVWxsZW5fYXJiX0dJTkkkYEFsbGUgTsOmcmluZ2VyYCAtCiAgbmFzam9uYWx0X2FyYmVpZHNzdGVkJGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9uYXNqb25hbHRfYXJiZWlkc3N0ZWQkYEFsbGUgTsOmcmluZ2VyYCkpICU+JSAKICAKICBzZWxlY3Qow4VyLCBgQWxsZSBOw6ZyaW5nZXJgLCBFaXJfRXJfUHJpbcOmciwgRWlyX0VyX0luZHVzdHJpLCBFaXJfRXJfSGVsc2UsIEVpbl9Fbl9Qcmltw6ZyLCBFaW5fRW5fSW5kdXN0cmksIEVpbl9Fbl9IZWxzZSwgTFFfUHJpbcOmciwgTFFfSW5kdXN0cmksIExRX0hlbHNlLCBHSU5JX1ByaW3DpnIsIEdJTklfSW5kdXN0cmksIEdJTklfSGVsc2UsIFJESV9Qcmltw6ZyLCBSRElfSW5kdXN0cmksIFJESV9IZWxzZSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTYpCmBgYAoKYGBge3J9CmthYmxlKAogIFVsbGVuX2FyYl9HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEdJTklfUHJpbcOmciwgR0lOSV9JbmR1c3RyaSwgR0lOSV9IZWxzZSwgUkRJX1ByaW3DpnIsIFJESV9JbmR1c3RyaSwgUkRJX0hlbHNlKSwKICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIsOFciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIj0yLCAiR0lOSSIgPSAzLCAiUkRJIiA9IDMpKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJVbGxlbnN2YW5nOiBHaW5pICYgUkRJIj04KSkKCmthYmxlKAogIFVsbGVuX2FyYl9HSU5JICU+JSAKICAgIHNlbGVjdCjDhXIsIGBBbGxlIE7DpnJpbmdlcmAsIEVpcl9Fcl9Qcmltw6ZyLCBFaXJfRXJfSW5kdXN0cmksIEVpcl9Fcl9IZWxzZSwgRWluX0VuX1ByaW3DpnIsIEVpbl9Fbl9JbmR1c3RyaSwgRWluX0VuX0hlbHNlLCBMUV9Qcmltw6ZyLCBMUV9JbmR1c3RyaSwgTFFfSGVsc2UpLAogICAgICAgICAgICAgY29sLm5hbWVzID0gYygiw4VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbcOmciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmR1c3RyaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltw6ZyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZHVzdHJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW3DpnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kdXN0cmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsc2UiKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MiwgIkVpci9FciIgPSAzLCAiRWluL0VuIiA9IDMsICJMUSIgPSAzKSkgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiVWxsZW5zdmFuZzogTG9rYWxrdm90aWVudCI9MTEpKQpgYGAKCj8/RGV0dGUgZmVyZGlnPz8KCi0tIE9wcGRhdGVydCBMUS12ZXJkaWFyCgojIyBOYXNqb25hbHQ/PyAoRGV0dGUga2FuIGthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYW5za2plIGJsaSB0YXR0IHZla2suIERldCBzZXIgdmkgZXR0ZXIga3ZhcnQpCgpgYGB7cn0KI3N5c3NlbF9hcmIgPC0gc3lzc2VsX2FyYiAlPiUgCiMgIG11dGF0ZShFaXJfRXJfSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVnIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAojICAgICAgICAgRWlyX0VyX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKIyAgICAgICAgIEVpcl9Fcl9FbF9WYW5uX1Jlbm8gPSBgRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb25gL2BBbGxlIE7DpnJpbmdlcmAsCiMgICAgICAgICBFaXJfRXJfQnlnZ19vZ19BbmxlZ2cgPSBgQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0YC9gQWxsZSBOw6ZyaW5nZXJgLAojICAgICAgICAgRWlyX0VyX0ZpbmFucyA9IGBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZ2AvYEFsbGUgTsOmcmluZ2VyYCwKIyAgICAgICAgIEVpcl9Fcl9VbmRlcnZpc25pbmcgPSBVbmRlcnZpc25pbmcvYEFsbGUgTsOmcmluZ2VyYCwKIyAgICAgICAgIEVpcl9Fcl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgKQpgYGAKCmBgYHtyfQojbmFzam9uYWx0X2FyYmVpZHNzdGVkIDwtIG5hc2pvbmFsdF9hcmJlaWRzc3RlZCAlPiUgCiMgIG11dGF0ZShFaW5fRW5fSm9yZGJydWsgPSBgSm9yZGJydWssIFNrb2dicnVrIG9nIEZpc2tlYC9gQWxsZSBOw6ZyaW5nZXJgLAojICAgICAgICAgRWluX0VuX0luZHVzdHJpID0gSW5kdXN0cmkvYEFsbGUgTsOmcmluZ2VyYCwKIyAgICAgICAgIEVpbl9Fbl9FbF9WYW5uX1Jlbm8gPSBgRWxla3RyaXNpdGV0LCBWYW5uIG9nIFJlbm92YXNqb25gL2BBbGxlIE7DpnJpbmdlcmAsCiMgICAgICAgICBFaW5fRW5fQnlnZ19vZ19BbmxlZ2cgPSBgQnlnZ2UtIG9nIEFubGVnZ3N2aXJrc29taGV0YC9gQWxsZSBOw6ZyaW5nZXJgLAojICAgICAgICAgRWluX0VuX0ZpbmFucyA9IGBGaW5hbnNpZXJpbmcgb2cgRm9yc2lrcmluZ2AvYEFsbGUgTsOmcmluZ2VyYCwKIyAgICAgICAgIEVpbl9Fbl9VbmRlcnZpc25pbmcgPSBVbmRlcnZpc25pbmcvYEFsbGUgTsOmcmluZ2VyYCwKIyAgICAgICAgIEVpbl9Fbl9IZWxzZSA9IGBIZWxzZS0gb2cgU29zaWFsdGplbmVzdGVyYC9gQWxsZSBOw6ZyaW5nZXJgKQoKCiNMUV9hcmJfSm9yZGJydWsgPC0gc3lzc2VsX2FyYiAlPiUgCiMgIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfSm9yZGJydWspICU+JSAKIyAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgCiMgIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQsIGFhciwgRWluX0VuX0pvcmRicnVrKSwgYnkgPSBjKCJhYXIiKSkgJT4lIAojICBtdXRhdGUoYW5kZWwgPSBFaXJfRXJfSm9yZGJydWsvRWluX0VuX0pvcmRicnVrKQoKCiNMUV9hcmJfSW5kdXN0cmkgPC0gc3lzc2VsX2FyYiAlPiUgCiMgIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfSW5kdXN0cmkpICU+JSAKIyAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgCiMgIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQsIGFhciwgRWluX0VuX0luZHVzdHJpKSwgYnkgPSBjKCJhYXIiKSkgJT4lIAojICBtdXRhdGUoYW5kZWwgPSBFaXJfRXJfSW5kdXN0cmkvRWluX0VuX0luZHVzdHJpKQoKCiNMUV9hcmJfRWxfVmFubl9SZW5vIDwtIHN5c3NlbF9hcmIgJT4lIAojICBzZWxlY3QoYWFyLCBrbmF2biwgRWlyX0VyX0VsX1Zhbm5fUmVubykgJT4lIAojICBtdXRhdGUoYWFyID0gYXMuY2hhcmFjdGVyKGFhcikpICU+JSAKIyAgbGVmdF9qb2luKHNlbGVjdCguZGF0YSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCwgYWFyLCBFaW5fRW5fRWxfVmFubl9SZW5vKSwgYnkgPSBjKCJhYXIiKSkgJT4lIAojICBtdXRhdGUoYW5kZWwgPSBFaXJfRXJfRWxfVmFubl9SZW5vL0Vpbl9Fbl9FbF9WYW5uX1Jlbm8pCgoKI0xRX2FyYl9CeWdnX0FubGVnZyA8LSBzeXNzZWxfYXJiICU+JSAKIyAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9CeWdnX29nX0FubGVnZykgJT4lIAojICBtdXRhdGUoYWFyID0gYXMuY2hhcmFjdGVyKGFhcikpICU+JSAKIyAgbGVmdF9qb2luKHNlbGVjdCguZGF0YSA9IG5hc2pvbmFsdF9hcmJlaWRzc3RlZCwgYWFyLCBFaW5fRW5fQnlnZ19vZ19BbmxlZ2cpLCBieSA9IGMoImFhciIpKSAlPiUgCiMgIG11dGF0ZShhbmRlbCA9IEVpcl9Fcl9CeWdnX29nX0FubGVnZy9FaW5fRW5fQnlnZ19vZ19BbmxlZ2cpCgoKI0xRX2FyYl9GaW5hbnMgPC0gc3lzc2VsX2FyYiAlPiUgCiMgIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfRmluYW5zKSAlPiUgCiMgIG11dGF0ZShhYXIgPSBhcy5jaGFyYWN0ZXIoYWFyKSkgJT4lIAojICBsZWZ0X2pvaW4oc2VsZWN0KC5kYXRhID0gbmFzam9uYWx0X2FyYmVpZHNzdGVkLCBhYXIsIEVpbl9Fbl9GaW5hbnMpLCBieSA9IGMoImFhciIpKSAlPiUgCiMgIG11dGF0ZShhbmRlbCA9IEVpcl9Fcl9GaW5hbnMvRWluX0VuX0ZpbmFucykKCgojTFFfYXJiX1VuZGVydmlzbmluZyA8LSBzeXNzZWxfYXJiICU+JSAKIyAgc2VsZWN0KGFhciwga25hdm4sIEVpcl9Fcl9VbmRlcnZpc25pbmcpICU+JSAKIyAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgCiMgIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQsIGFhciwgRWluX0VuX1VuZGVydmlzbmluZyksIGJ5ID0gYygiYWFyIikpICU+JSAKIyAgbXV0YXRlKGFuZGVsID0gRWlyX0VyX1VuZGVydmlzbmluZy9FaW5fRW5fVW5kZXJ2aXNuaW5nKQoKCiNMUV9hcmJfSGVsc2UgPC0gc3lzc2VsX2FyYiAlPiUgCiMgIHNlbGVjdChhYXIsIGtuYXZuLCBFaXJfRXJfSGVsc2UpICU+JSAKIyAgbXV0YXRlKGFhciA9IGFzLmNoYXJhY3RlcihhYXIpKSAlPiUgCiMgIGxlZnRfam9pbihzZWxlY3QoLmRhdGEgPSBuYXNqb25hbHRfYXJiZWlkc3N0ZWQsIGFhciwgRWluX0VuX0hlbHNlKSwgYnkgPSBjKCJhYXIiKSkgJT4lIAojICBtdXRhdGUoYW5kZWwgPSBFaXJfRXJfSGVsc2UvRWluX0VuX0hlbHNlKQpgYGAKCmBgYHtyfQojc3lzc2VsX2FyYiA8LSBzeXNzZWxfYXJiICU+JSAKIyAgbXV0YXRlKExRX2FyYl9Kb3JkYnJ1ayA9IExRX2FyYl9Kb3JkYnJ1ayRhbmRlbCwKIyAgICAgICAgIExRX2FyYl9JbmR1c3RyaSA9IExRX2FyYl9JbmR1c3RyaSRhbmRlbCwKIyAgICAgICAgIExRX2FyYl9FbF9WYW5uX1Jlbm8gPSBMUV9hcmJfRWxfVmFubl9SZW5vJGFuZGVsLAojICAgICAgICAgTFFfYXJiX0J5Z2dfQW5sZWdnID0gTFFfYXJiX0J5Z2dfQW5sZWdnJGFuZGVsLAojICAgICAgICAgTFFfYXJiX0ZpbmFucyA9IExRX2FyYl9GaW5hbnMkYW5kZWwsCiMgICAgICAgICBMUV9hcmJfVW5kZXJ2aXNuaW5nID0gTFFfYXJiX1VuZGVydmlzbmluZyRhbmRlbCwKIyAgICAgICAgIExRX2FyYl9IZWxzZSA9IExRX2FyYl9IZWxzZSRhbmRlbCkKYGBgCgpgYGB7cn0KI0xRX2FyYiA8LSBzeXNzZWxfYXJiICU+JSAKIyAgc2VsZWN0KGFhciwga25hdm4sIExRX2FyYl9Kb3JkYnJ1aywgTFFfYXJiX0luZHVzdHJpLCBMUV9hcmJfRWxfVmFubl9SZW5vLCBMUV9hcmJfQnlnZ19BbmxlZ2csIExRX2FyYl9GaW5hbnMsIExRX2FyYl9VbmRlcnZpc25pbmcsIExRX2FyYl9IZWxzZSkKYGBgCgpgYGB7cn0KI0xRX2FyYltpcy5uYShMUV9hcmIpXSA9IDAKYGBgCgotICAgCgojIFBlbmRsaW5nCgpEZSB1bGlrZSBrb21tdW5lbmUgb2cgcmVnaW9uZW5lIGhhciB1bGlrZSBiZWhvdiwgZm9yIGF0IHJlZ2lvbmVuZSBza2FsIHV0dmlrbGUgc2VnIGVyIHBlbmRsaW5nIGV0IHZpa3RpZyBiZWdyZXAgZm9yIMOlIHRpbHRyZWtrZSBzZWcgYXJiZWlkc2tyYWZ0LgpWZWxkaWcgbWFuZ2Uga29tbXVuZXIgaGFyIGZvciBsaXRlIGFyYmVpZHNwbGFzc2VyIGkgZm9yaG9sZCB0aWwgYW50YWxsIGFyYmVpZGVuZGUgaW5uYnlnZ2VyZSwgc29tIHZpbCBzaSBhdCBkZSBmbGVzdGUgZXIgYXZoZW5naWdlIGF2IHBlbmRsZXJlLgpQZW5kbGluZyBrYW4gdsOmcmUgdGlsIGFuZHJlIGtvbW11bmVyIGkgc2FtbWUgcmVnaW9uIGVsbGVyIHRpbCBhbmRyZSByZWdpb25lci4KQWxsZSBrb21tdW5lciBoYXIga2Fuc2tqZSBpa2tlIGFyYmVpZHNwbGFzc2VyIGlubmVuIGFsbGUgZmFnZmVsdCwgYXJiZWlkc3Rha2VyZSBlciBkZXJmb3IgYXZoZW5naWcgYXYgw6UgcGVuZGxlciB0aWwgYW5kcmUga29tbXVuZXIgZm9yIMOlIGZpbm5lIHJlbGV2YW50IGFyYmVpZC4KRGV0IHNhbW1lIGdqZWxkZXIgZGVyc29tIGFyYmVpZHN0YWtlciBoYXIgdGlsaMO4cmlnaGV0IHRpbCBlbiBrb21tdW5lLCBtZW4gZGV0IGlra2UgZmlubmVzIHJlbGV2YW50IGFyYmVpZCBkYSBlciBoYW4gb2dzw6UgbsO4ZHQgdGlsIMOlIHPDuGtlIGpvYmIgaSBhbmRyZSBrb21tdW5lci4KSGVyIGtvbW1lciBiZWdyZXBlbmUgaW5ucGVuZGxpbmcgb2cgdXRwZW5kbGluZyBpbm4sIHNvbSBiZXR5ciBhdCBub2VuIGtvbW11bmVyIGVsbGVyIHJlZ2lvbmVyIGhhciBmbGVyZSBhcmJlaWRzcGxhc3NlciB0aWxnamVuZ2VsaWdlIGVubiBkZSBoYXIgaW5uYnlnZ2VyZSBzb20ga2FuIGpvYmJlIGlubmFkIGkga29tbXVuZW4gZWxsZXIgYXQgZGUgaWtrZSBoYXIgbm9rIGFyYmVpZHNwbGFzc2VyIG9nIGlubmJ5Z2dlcmVuZSBlciBuw7hkdCB0aWwgw6Ugc8O4a2Ugam9iYiBhbmRyZSBwbGFzc2VyLgpWaSBza2FsIHNlIHDDpSBpbm5wZW5kbGluZyBvZyB1dHBlbmRsaW5nIHNvbSB2aWwga3VubmUgZm9ydGVsbGUgb3NzIGkgaHZpbGtlbiBncmFkIGV0IHN0ZWQgZXIgaW50ZWdyZXJ0IGkgZXQgc3TDuHJyZSBhcmJlaWRzbWFya2VkIDxodHRwczovL3JlZ2lvbmFsYW5hbHlzZS5uby9yYXBwb3J0LzMwMDQvMS80Pi4KCk5lZGVuZm9yIHZpbCB2aSBmw7hyc3QgdGEgZm9yIG9zcyByZWdpb25lbiBIYXVnYWxhbmRldCBvZyBTdW5uaG9yZGxhbmQgbWVkIFVsbGVuc3ZhbmcsIG9nIHNlIHDDpSBkaXNzZSByZWdpb25lbmUgaHZlciBmb3Igc2VnLgpTw6Uga29tbWVyIGVuIHRhYmVsbCBzb20gdGFyIGZvciBzZWcgZGlzc2UgcmVnaW9uZW5lIHNhbWxldC4KVmkgw7huc2tlciBmw7hyc3Qgw6Ugc2tpbGxlIGRpc3NlIHRvIHJlZ2lvbmVuZSBmb3Igw6Ugc2UgaSBodmlsa2VuIGtvbW11bmUgYW5kZWxlbiBhdiBpbm5wZW5kbGluZyBvZyB1dHBlbmRsaW5nIGVyIHN0w7hyc3Qgb2cgbWluc3QuCkZvciBzw6Ugw6Ugc2UgcMOlIHBlbmRsaW5nZW4gbWVsbG9tIHJlZ2lvbmVuZS4KCkkgcmFkZW5lIHNlZXMgcGVuZGxpbmcgaW5uIHRpbCBrb21tdW5lbmUuCk5lZGVyc3RlIHJhZCB2aXNlciB0b3RhbGVuIGF2IGFudGFsbCBwZW5kbGVyZSBpbm4gdGlsIGRlbiBlbmtlbHRlIGtvbW11bmUuCkhlciBrYW4gdmkgc2UgZW4gYW5kZWwgc3RpbGxpbmdlciBzb20gZXIgYmVzYXR0IGF2IGFyYmVpZHN0YWtlcmUgZnJhIGFuZHJlIGtvbW11bmVyIGkgSGF1Z2FsYW5kc3JlZ2lvbmVuLgoKSSBrb2xvbm5lbmUgc2VyIG1hbiBkZSBzb20gcGVuZGxlcmUgdXQgYXYgaHZlciBlbmtlbHQga29tbXVuZS4KRGV0IHZpbCBzaSBhcmJlaWRzdGFrZXJlIHNvbSBib3IgaSBlbiBrb21tdW5lLCBvZyBzb20gaGFyIGFyYmVpZHN0ZWQgaSBlbiBhbm5lbiBrb21tdW5lIGlubmVuZm9yIEhhdWdsYW5kc3JlZ2lvbmVuLgoKRGUgc29tIGVyIG1hcmtlcnQgbWVkIGd1bHQgZXIgYXJiZWlkc3Rha2VyZSBzb20gYm9yIG9nIGpvYmJlciBpIHNhbW1lIGtvbW11bmUuCgpIYXVnbGFuZHNyZWdpb25lbjoKCiFbXShCaWxkZS9IYXVnYWxhbmRldC5QTkcgIkhhdWdsYW5kc3JlZ2lvbmVuIikKCkhhdWdhbGFuZHNyZWdpb25lbiBoYXIgNDQxMTkgYXJiZWlkc3BsYXNzZXIsIGh2b3JhdiAxMzE3MCBlciBwZW5kbGVyZS4KCkhhdWdlc3VuZCwgS2FybcO4eSBvZyBUeXN2w6ZyIGVyIGRlIGtvbW11bmVuZSBpIHJlZ2lvbmVuIG1lZCBow7h5ZXN0IGFuZGVsIHBlbmRsZXJlIGLDpWRlIG7DpXIgZGV0IGdqZWxkZXIgaW5uLSBvZyB1dHBlbmRsaW5nLgpMYSBvc3Mgc2UgbsOmcm1lcmUgcMOlIEhhdWdlc3VuZCBzb20gaGFyIGVuIHN0b3IgZGVsIGF2IGFyYmVpZHN0YWtlcm5lIGkgcmVnaW9uZW4uCkRldCBnamVsZGVyIGLDpWRlIG7DpXIgdmkgc2VyIHDDpSBpbm5wZW5kbGluZywgdXRwZW5kbGluZyBvZyBkZSBzb20gYm9yIG9nIGpvYmJlciBpIHNhbW1lIGtvbW11bmUuClV0IGlmcmEgdGFiZWxsZW4ga2FuIHZpIHNlIGF0IEhhdWdlc3VuZCBoYXIgMTE3MTQgYXJiZWlkc3Rha2VyZSBzb20gYm9yIG9nIGpvYmJlciBpIGtvbW11bmVuLgpGcmEgSGF1Z2VzdW5kIGVyIGRldCBla3NlbXBlbHZpcyAxMDI5IGFyYmVpZHN0YWtlcmUgc29tIHBlbmRsZXIgdGlsIFR5c3bDpnIgb2cgMjU4NiBhcmJlaWRzdGFrZXJlIHNvbSBwZW5kbGVyIHRpbCBLYXJtw7h5LgpUaWwgU2F1ZGEgb2cgVXRzaXJhIGVyIGRldCBlbiBiZXR5ZGVsaWcgbGF2ZXJlIGFuZGVsIHNvbSBwZW5kbGVyLgpHcnVubmVuIHRpbCBhdCBkZXQgbm9rIGF0IGRldCBlciBtaW5kcmUga29tbXVuZXIgbWVkIGbDpnJyZSBhcmJlaWRzcGxhc3Nlci4KTWFuZ2UgYXYgZGUgc29tIGJvciBpIGRpc3RyaWt0ZW5lIHNvbSBla3NlbXBlbHZpcyBTYXVkYSBvZyBVdHNpcmEgam9iYmVyIG9nIGJvciBpIHNhbW1lIGtvbW11bmUuClZpIGthbiBzZSBhdCBpIFNhdWRhIGpvYmJlciBvZyBib3IgZGV0IDE3ODkgYXJiZWlkc3Rha2VyLCBtZW5zIGRlIGhhciAzMSBzdHlrayBzb20gcGVuZGxlciBpbm4gdGlsIGtvbW11bmVuIG9nIDY2IHN0eWtrIHNvbSBwZW5kbGVyIHV0IGF2IGtvbW11bmVuLgpEZXQga2FuIHbDpnJlIGZsZXJlIHNvbSBwZW5kbGVyIGlubiB0aWwgb2cgdXQgYXYga29tbXVuZW4gZnJhIGFuZHJlIHJlZ2lvbmVyLCBtZW4gaGVyIHNlciB2aSB0YWxsZW5lIHDDpSBkZSBzb20gcGVuZGxlciBpIEhhdWdhbGFuZHNyZWdpb25lbi4KClZpIHZldCBhdCBIYXVnZXN1bmQgZXIgcmVnaW9uc2VudHJ1bSBtZWQgc3lrZWh1cyBvZyBow7hnc2tvbGUuClNhbXRpZGlnIGhhciBIYXVnZXN1bmQgZmxlcmUgb2xqZSBvZyBzasO4ZmFydHNuw6ZyaW5nZXIuCkRldCBlciBzZW50cmFsaXNlcnQgc29tIGJldHlyIGF0IGRldCBlciBncnVubmxhZyBmb3IgZXQgc3TDuHJyZSBqb2JibWFya2VkLgpEZXQgZXIgw6Vyc2FrZW4gdGlsIGF0IEhhdWdlc3VuZCBoYXIgbWVyIGlubnBlbmRsaW5nIGVubiBkZSBhbmRyZSBrb21tdW5lbmUgaSByZWdpb25lbi4KS2FybcO4eSBvZyBUeXN2w6ZyIHNvbSBsaWdnZXIgbsOmcm1lc3QgSGF1Z2VzdW5kIGhhciBzdMO4cnN0IGFuZGVsIHV0cGVuZGxpbmcsIG9nc8OlIHRpbCBIYXVnZXN1bmQuCgpTdW5uaG9yZGxhbmQKCiFbXShCaWxkZS9TdW5uaG9yZGxhbmQuUE5HICJTdW5uaG9yZGxhbmQgb2cgVWxsZW5zdmFuZyIpCgpJIFN1bm5ob3JkbGFuZHNyZWdpb25lbiBlciBkZXQgMjgyNzUgYXJiZWlkc3Rha2VyZSBvbSBoYXIgc2luIGFyYmVpZHNwbGFzcywgYXYgZGlzc2UgZXIgZGV0IDI1NzUgc29tIGhhciBzaXR0IGFyYmVpZCBpIGVuIGFubmVuIGtvbW11bmUgZW5uIGRlbiBkZSBib3IgaS4KClNvbSB2aSBrYW4gc2UgZXIgU3RvcmQgZGVuIGtvbW11bmVuIG1lZCBmbGVzdCBhcmJlaWRzdGFrZXJlLgpEZXR0ZSBrYW4gdmkgc2UgaSBzYW1tZW5oZW5nIG1lZCBhdCBTdG9yZCBlciBzb20gZXQgc2VudHJ1bSBmb3IgcmVnaW9uZW4uCkVuIGRlbCBhdiBkZSBpbnRlcmtvbW11bmFsZSBzYW1hcmJlaWRlbmUgaGFyIHNpbmUga29udG9yZXIgbG9rYWxpc2VydCBww6UgU3RvcmQuClN0b3JkIGhhciA3MzE0IHNvbSBiw6VkZSBib3Igb2cgYXJiZWlkZXIgaW5uYWQgaSBrb21tdW5lbi4Kw4UgYXYgU3RvcmRhYnVlbiBzb20gcGVuZGxlciB1dCBhdiBrb21tdW5lbiBlciBkZXQgZmxlc3Qgc29tIHBlbmRsZXIgdGlsIELDuG1sbyBvZyBGaXRqYXIuCkRldHRlIGdqZWxkZXIgb2dzw6UgbW90c2F0dCBkYSBTdG9yZCBmw6VyIGZsZXN0IGlubnBlbmRsZXJlIGZyYSBkZSBzYW1tZSBrb21tdW5lbmUuClN0b3JkIG9nIFVsbGVuc3ZhbmcgZXIgZGUgZW5lc3RlIGtvbW11bmVuZSBzb20gaGFyIGZsZXJlIHNvbSBwZW5kbGVyIGlubiBlbm4gdXQuCgpJIEV0bmUgZXIgZGV0IGdhbnNrZSBsaWt0IG1lZCBpbm4gb2cgdXRwZW5kbGVyZSBkYSBkZSBoYXIgNjYgc29tIHBlbmRsZXIgdXQgb2cgNjEgc29tIHBlbmRsZXIgaW5uIHRpbCBrb21tdW5lbi4KRXRuZSBlciBvZ3PDpSBkZW4ga29tbXVuZW4gc29tIGhhciBtaW5zdCBhcmJlaWRlcmUgc29tIGRyaXZlciBtZWQgcGVuZGxpbmcuCgpWaSBoYXIgdmFsZ3Qgw6UgdGEgbWVkIFVsbGVuc3ZhbmcgaSBTdW5uaG9yZGxhbmRzb3ZlcnNpa3Rlbi4KRXRuZSBvZyBLdmlubmhlcmFkIGVyIGJlZ2dlIG5hYm9rb21tdW5lciB0aWwgVWxsZW5zdmFuZy4KVWxsZW5zdmFuZyBoYXIgbGl0ZSBiw6VkZSBpbm4gb2cgdXRwZW5kbGluZy4KCkVuIHNhbWxldCBvdmVyc2lrdCBvdmVyIEhhdWdhbGFuZHNyZWdpb25lbiBvZyBTdW5uaG9yZGxhbmRzcmVnaW9uZW4KCiFbXShCaWxkZS9TYW1sZXQuUE5HICJTYW1sZXQgb3ZlcnNpa3QiKQoKVmkgaGFyIHNldHQgcMOlIGlubmRlbGluZ2VuZSBpIGRlIGZvcnNramVsbGlnZSByZWdpb25lbmUuClZpZGVyZSDDuG5za2VyIHZpIMOlIHNlIHDDpSByZWdpb25lbmUgaSBlbiBzYW1sZXQgdGFiZWxsLgoKVmkgaGFyIHRpZGxpZ2VyZSBza3JldmV0IG9tIGF0IEhhdWdhbGFuZHNyZWdpb25lbiBoYXIgMTMxNzAgcGVuZGxlcmUsIG1lbnMgU3VubmhvcmRsYW5kc3JlZ2lvbmVuIG9nIFVsbGVuc3ZhbmcgaGFyIDI1NzUgcGVuZGxlcmUuCk9tIHZpIHNlciBiZWdnZSByZWdpb25lbmUgc2FtbGV0LCDDuGtlciBhbnRhbGwgcGVuZGxlcmUgbWVkIHRvdGFsdCAzMzExIGFyYmVpZHN0YWtlcmUuCkRldCB2aWwgc2kgYXQgZGV0IGVyIDMzMTEgc3R5a2tlciBzb20gcGVuZGxlciBww6UgdHZlcnMgYXYgcmVnaW9uZW5lLgoKVXRzaXJhIGhhciBpa2tlIGlubi0gZWxsZXIgdXRwZW5kbGVyZSB0aWwgU3VubmhvcmRsYW5kLgpCb3J0c2V0dCBmcmEgZW4gcGVyc29uIHNvbSBwZW5kbGVyIHRpbCBTdmVpbyBoYXIgaGVsbGVyIGlra2UgQm9rbiB1dHBlbmRsaW5nIHRpbCBTdW5uaG9yZGxhbmQuCgpIYXVnZXN1bmQgZXIgZGVuIGtvbW11bmVuIHNvbSBoYXIgZmxlc3QgcGVuZGxlcmUgaW5uIHRpbCBrb21tdW5lbi4KRGUgbGlnZ2VyIGxhbmd0IGZvcmFuIGRlIGFuZHJlIGtvbW11bmVuZSBuw6VyIGRldCBlciBzbmFrayBvbSBwZW5kbGluZyBpbm4gdGlsIGtvbW11bmVuZS4KS2FybcO4eSBlciBkZW4ga29tbXVuZW4gc29tIGhhciBmbGVzdCBpbm5ieWdnZXJlIHNvbSBwZW5kbGVyIHV0IGF2IGtvbW11bmVuLgoKVmlkZXJlIGthbiBtYW4gc2UgcMOlIGRlIHN5c3RlbWF0aXNrZSBmb3Jza2plbGxlbmUgc2V0dCBpIGZvcmhvbGQgdGlsIHNlbnRyYWxpdGV0IG9nIHRpbGdqZW5nZWxpZ2hldCBpIGRldCBsb2thbGUgYXJiZWlkc21hcmtlZGV0LgoKSGF1Z2VzdW5kLCBLYXJtw7h5IG9nIFN0b3JkIGVyIHNlbnRyYWxlIGtvbW11bmVyIGh2b3IgZGV0IGZpbm5lcyBlbiBzdG9yIGFuZGVsIGFyYmVpZHNwbGFzc2VyIG9nIHRpbGdqZW5nZWxpZ2hldGVuIGkgYXJiZWlkc21hcmtlZGV0IGVyIHN0w7hycmUgZW5uIGkgZWtzZW1wZWx2aXMgU2F1ZGEsIFV0c2lyYSwgVHlzbmVzIGVsbGVyIFVsbGVuc3ZhbmcuCkRlIHNlbnRyYWxpc2VydGUga29tbXVuZW5lIGhhciBlbiBmb3JkZWwgaSBmb3Job2xkIHRpbCDDpSBza2FwZSBrbHluZ2VyLCBkZXQgbWVkIHRhbmtlIHDDpSBhdCBuw6VyIGZsZXJlIG1lbm5lc2tlciBib3NldHRlciBzZWcgaSBzYW1tZSBvbXLDpWRlIGthbiBlbiBkcmEgbnl0dGUgYXYga29tcGV0YW5zZW4gZGUgaW5uZWhhci4KU2F1ZGEsIFV0c2lyYSwgVHlzbmVzIG9nIFVsbGVuc3ZhbmcgZXIgZWtzZW1wbGVyIHDDpSBrb21tdW5lciBpIHV0a2FudGVuIGF2IHJlZ2lvbmVuZS4KRGUgYmVmaW5uZXIgc2VnIHPDpXBhc3MgbGFuZ3QgdXRlbmZvciBhdCBkZSBpa2tlIHZpbCBkcmEgbnl0dGUgYXYgc2VudHJhbGl0ZXQuCgpJIGZpZ3VyIDMgb2cgNCB2aXNlcyBkZXQgYXQgZGUgc2lzdGUgMTAgw6VyZW5lIGhhciBIYXVnZXN1bmQgaGF0dCBlbiByZWR1a3Nqb24gaSBhbnRhbGwgYW5zYXR0ZSwgbWVuIEthcm3DuHksIFZpbmRhZmpvcmQgb2cgVHlzdsOmciBoYXIgaGF0dCBlbiBtYXJrYW50IMO4a25pbmcgaSBhbnRhbGwgYXJiZWlkc3Rha2VyZS4KRGV0IHZpIHZldCBlciBhdCBkZXQgaGFyIHV0dmlrbGV0IHNlZyBzdMO4cnJlIG7DpnJpbmdza2x5bmdlciB1dGVuZm9yIEhhdWdlc3VuZCBkZSBzaXN0ZSDDpXJlbmUgc29tIGthbiBoYSBlbiBzYW1tZW5oZW5nIG1lZCDDuGtuaW5nIGkgYW50YWxsIGFuc2F0dGUuClNhbXRpZGlnIGhhciBvbGplYnJhbnNqZW4gaSBzYW1tZSBwZXJpb2RlIHNsaXR0IG1lZCBuZWRnYW5nc3RpZGVyIHNvbSBww6V2aXJrZXIgYsOlZGUgSGF1Z2VzdW5kIG9nIFN0b3JkLgpEaXNzZSBrb21tdW5lbmUgaGFyIGVuIGRlbCBvbGplYmFzZXJ0ZSBuw6ZyaW5nZXIgb2cgaSBkZSBwZXJpb2RlbmUgb2xqZW1hcmtlZGV0IHN2aW5nZXIgdmlsIGFyYmVpZHNtYXJrZWRldCB2aXNlIG1hcmthbnQgbmVkZ2FuZyBpIGFudGFsbCBhcmJlaWRzcGxhc3Nlci4KRGV0IHZpbCBvZ3PDpSB2aXNlIGVuIGJldHlkZWxpZyDDuGtuaW5nIGkgYW50YWxsIGFyYmVpZHNwbGFzc2VyIG9tIGRldCBlciBvcHBnYW5nc3RpZGVyLgpPcHBnYW5nc3RpZGVyIGkgb2xqZW7DpnJpbmdlbiBnaXIgZW4gw7hrbmluZyBhdiBwZW5kbGVyZSBpbm4gdGlsIGtvbW11bmVyIHNvbSBoYXIgdmlya3NvbWhldGVyIGlubmVuZm9yIG9samVuw6ZyaW5nZW4uCgotICAgCgpgYGB7ciBzaXN0ZX0KIyBTaXN0ZQpgYGAKCi0gICAK